• node.js知识系列(4)-每天了解一点



    👍 点赞,你的认可是我创作的动力!

    ⭐️ 收藏,你的青睐是我努力的方向!

    ✏️ 评论,你的意见是我进步的财富!


    11. 异步文件操作

    Node.js 提供了异步文件操作的 API,用于读取和写入文件。通常,您可以使用 fs 模块来执行这些操作。以下是一些基本的文件读取和写入示例:

    文件读取

    const fs = require('fs');
    
    fs.readFile('file.txt', 'utf8', (err, data) => {
      if (err) {
        console.error(err);
        return;
      }
      console.log(data); // 读取文件内容
    });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    文件写入

    const fs = require('fs');
    
    const content = 'Hello, Node.js!';
    fs.writeFile('file.txt', content, (err) => {
      if (err) {
        console.error(err);
        return;
      }
      console.log('文件已写入');
    });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在上述示例中,文件读取和写入操作是异步执行的,当操作完成或出现错误时,回调函数会被调用。

    12. 包管理器(npm)

    Node.js 的包管理器(npm)是用于管理 JavaScript 包和依赖项的工具。它的主要功能和用途包括:

    • 包安装和管理:npm 允许您轻松安装、更新和卸载 JavaScript 包。通过运行 npm install package-name,您可以安装特定的包。
    • 项目依赖管理:npm 允许您在项目中定义依赖项,将依赖信息记录在 package.json 文件中。这使得共享项目和管理依赖变得更加简单。
    • 脚本执行:您可以在 package.json 文件中定义自定义脚本,以简化项目中的常见任务,如构建、测试和部署。
    • 包发布:如果您编写了一个 JavaScript 包,npm 允许您将其发布到 npm 包仓库,以供其他开发者使用。
    • 版本控制:npm 使用语义化版本控制,使得可以指定依赖项的版本范围,以确保项目的稳定性和兼容性。

    13. 子进程

    Node.js 的子进程是一个独立的进程,可以在您的应用程序中创建和管理它们。子进程通常用于执行外部命令、脚本或其他程序。

    Node.js 提供了 child_process 模块,用于创建和与子进程进行通信。以下是创建子进程的基本示例:

    const { spawn } = require('child_process');
    
    const child = spawn('ls', ['-l']); // 创建子进程运行 'ls -l' 命令
    
    child.stdout.on('data', (data) => {
      console.log(`子进程输出:${data}`);
    });
    
    child.on('close', (code) => {
      console.log(`子进程退出,退出码 ${code}`);
    });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在上述示例中,我们使用 spawn 方法创建了一个子进程来运行 ls -l 命令。子进程的输出和关闭事件都被监听,以便处理子进程的输出和退出。

    14. 事件发射器(EventEmitter)

    事件发射器是 Node.js 核心模块之一,用于实现事件驱动编程。它允许对象可以绑定自定义事件和触发这些事件。事件发射器在应用程序中的使用案例包括:

    • 自定义事件:您可以创建自己的事件,以便在应用程序中响应特定的行为或状态变化。
    • 回调函数注册:事件发射器允许将回调函数注册到事件上,并在事件触发时执行这些回调。
    • 异步通信:它允许模块之间进行异步通信,使代码更加模块化和可维护。

    以下是一个简单的事件发射器示例:

    const EventEmitter = require('events');
    
    class MyEmitter extends EventEmitter {}
    
    const myEmitter = new MyEmitter();
    
    myEmitter.on('event', () => {
      console.log('事件已触发');
    });
    
    myEmitter.emit('event'); // 触发事件
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在上述示例中,我们创建了一个自定义事件发射器 MyEmitter,并定义了一个事件处理函数。然后,我们绑定事件处理函数到事件上,并使用 emit 方法触发事件。

    15. 异步编程和回调

    在 Node.js 中,异步编程是一种重要的编程模式,用于处理非阻塞操作,以提高应用程序的性能和响应速度。异步编程主要通过回调函数实现,回调函数将在操作完成后执行。

    以下是一个简单的异步回调示例:

    const fs = require('fs');
    
    fs.readFile('file.txt', 'utf8', (err, data) => {
      if (err) {
        console.error(err);
        return;
      }
      console.log(data); // 读取文件内容
    });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在上述示例中,fs.readFile 是一个异步操作,当文件读取完成后,回调函数将被执行。这样可以避免阻塞应用程序,允许其他操作继续执行。

    Node.js 还提供了其他异步编程模式,如 Promise 和 async/await,以更容易地处理异步操作和回调。

    16. Node.js 集成测试工具和框架

    在 Node.js 中进行集成测试时,有几个常见的工具和框架可供选择,以确保应用程序的各个部分协同工作并具备预期的功能。一些常见的工具和最佳实践包括:

    • Mocha:Mocha 是一个流行的测试框架,它提供了强大的测试运行器和丰富的断言库。它支持异步测试和各种报告器。
    • Chai:Chai 是一个断言库,与 Mocha 配合使用,使您可以编写可读性强的测试用例。
    • Supertest:Supertest 是一个用于测试 HTTP 接口的库,可以轻松模拟 HTTP 请求并断言响应。
    • Jest:Jest 是一个全功能的 JavaScript 测试框架,可用于编写单元测试和集成测试。它具有内置的断言库,支持异步测试和模拟功能。
    • Cypress:Cypress 是一个端到端的测试框架,用于编写自动化的用户界面测试。它提供了一个实时预览功能,使测试编写和运行变得更加直观。

    最佳实践包括编写独立的测试用例、模拟依赖项、在测试之前和之后执行清理操作,并定期运行测试套件以确保应用程序的稳定性。

    17. Express.js 中间件的 HTTP 请求流程

    Express.js 中的中间件处理 HTTP 请求流程遵循以下原则:

    1. 请求阶段:在请求进入 Express.js 应用程序时,会按照定义的顺序执行各个中间件。这些中间件可以执行请求预处理、身份验证、日志记录等操作。
    2. 路由匹配:当请求进入中间件链时,Express.js 会匹配请求的 URL 路径和 HTTP 方法与已定义的路由。匹配的路由处理函数将被执行。
    3. 路由处理:路由处理函数执行后,如果没有调用 next(),请求处理流程将在此结束。如果调用了 next(),控制将传递给下一个中间件或路由处理函数。
    4. 错误处理:如果在路由处理或中间件中发生错误(通过 next(err) 抛出),错误处理中间件将捕获错误并执行相应的错误处理逻辑。
    5. 响应阶段:最终,响应被发送到客户端,可能经过多个中间件来进行最后的修改,例如设置响应头、发送数据等。

    中间件的执行顺序取决于它们在应用程序中的定义顺序。通常,中间件链按照定义的顺序依次执行。但如果某个中间件未调用 next(),则不会执行链中的后续中间件。

    18. 文件上传和验证

    在 Express.js 中处理文件上传并验证文件类型和大小通常需要使用第三方中间件,如 multer。以下是一个简单的示例,演示如何处理文件上传并验证文件类型和大小:

    const express = require('express');
    const multer = require('multer');
    const app = express();
    
    // 配置文件上传
    const storage = multer.diskStorage({
      destination: (req, file, cb) => {
        cb(null, 'uploads/');
      },
      filename: (req, file, cb) => {
        cb(null, file.originalname);
      },
    });
    
    const fileFilter = (req, file, cb) => {
      if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
        cb(null, true); // 允许上传
      } else {
        cb(new Error('只允许上传 JPEG 和 PNG 格式的图片'), false); // 拒绝上传
      }
    };
    
    const upload = multer({
      storage,
      fileFilter,
      limits: {
        fileSize: 1024 * 1024, // 限制文件大小为 1MB
      },
    });
    
    // 处理文件上传
    app.post('/upload', upload.single('file'), (req, res) => {
      res.send('文件上传成功');
    });
    
    app.listen(3000, () => {
      console.log('服务器正在监听端口 3000');
    });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    上述示例中,使用 multer 中间件配置了文件上传,并添加了文件类型验证、文件大小限制等功能。上传的文件将被保存到指定的目录。

    19. Express.js 中的 WebSocket 支持

    Express.js 本身不提供原生的 WebSocket 支持,但可以集成 WebSocket 库,例如 socket.io,以实现 WebSocket 功能。

    以下是一个简单的 Express.js 与 socket.io 集成的 WebSocket 示例:

    const express = require('express');
    const http = require('http');
    const socketIo = require('socket.io');
    
    const app = express();
    const server = http.createServer(app);
    const io = socketIo(server);
    
    io.on('connection', (socket) => {
      console.log('用户已连接');
    
      socket.on('chat message', (msg) => {
        io.emit('chat message', msg); // 广播消息给所有客户端
      });
    
      socket.on('disconnect', () => {
        console.log('用户已断开连接');
      });
    });
    
    app.get('/', (req, res) => {
      res.sendFile(__dirname + '/index.html');
    });
    
    server.listen(3000, () => {
      console.log('服务器正在监听端口 3000');
    });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    在上述示例中,使用 Express.js 创建 HTTP 服务器,并集成 socket.io 来处理 WebSocket 连接。客户端可以通过 WebSocket 发送和接收消息。

    20. 身份验证和授权中间件

    Express.js 中有许多身份验证和授权中间件可供选择。其中一些常见的包括 Passport.js、jsonwebtoken、和 express-jwt。

    • Passport.js:是一个灵活且广泛使用的身份验证中间件,支持

    多种身份验证策略(例如本地策略、OAuth、OpenID 等)。

    • jsonwebtoken:是一个用于生成和验证 JSON Web Tokens(JWT)的库,可用于实现基于令牌的身份验证和授权。
    • express-jwt:是一个 Express.js 中间件,用于验证 JWT 令牌。它可以轻松集成到 Express.js 应用程序中,以保护特定的路由或资源。

    身份验证中间件通常用于验证用户的身份,而授权中间件用于控制用户对资源的访问权限。这些中间件可以根据需求进行配置,以满足应用程序的安全性需求。

  • 相关阅读:
    LeetCode--580. 统计各专业学生人数
    始祖双碳新闻 | 2022年7月21日碳中和行业早知道
    typescript 基础一篇掌握(一万四千字攻略总结)
    如何处理前端错误和异常?
    Flask入门学习教程
    2023年浙工商MBA新生奖学金名单公布,如何看待?
    一款能“干掉” ChatGPT 的应用「GitHub 热点速览」
    Spring Boot 2.x源码系列【6】启动流程深入解析之创建、准备上下文
    罗丹明聚乙二醇羧基,RB-PEG-COOH,Rhodamine polyethylene glycol carboxylic acid
    SAP-FI配置与业务解析之外币清账业务处理
  • 原文地址:https://blog.csdn.net/weixin_52003205/article/details/133778239