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

这篇具有很好参考价值的文章主要介绍了node.js知识系列(2)-每天了解一点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


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

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

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


11. 执行子进程(child processes)

在 Node.js 中,您可以使用 child_process 模块来执行子进程。这允许您在 Node.js 应用程序中启动外部命令或脚本,与它们进行交互并获取输出。

以下是一个简单的子进程执行示例,调用 ls 命令列出目录内容:

const { exec } = require('child_process');

exec('ls', (error, stdout, stderr) => {
  if (error) {
    console.error(`执行出错: ${error}`);
    return;
  }
  console.log(`stdout: ${stdout}`);
  console.error(`stderr: ${stderr}`);
});

场景示例:在一个 Web 服务器上,您可以使用子进程执行一个 Python 脚本,该脚本根据请求动态生成图像并将其返回给客户端。

12. Express.js 中的 WebSocket 库

Express.js 本身不包含 WebSocket 支持,但您可以使用第三方 WebSocket 库,如 socket.io,来与 Express.js 集成以实现实时通信。这些库使得建立 WebSocket 连接和处理实时消息变得更加容易。

使用 socket.io 可以创建 WebSocket 服务器并与 Express.js 服务器一起运行,允许客户端和服务器之间的双向通信。典型的应用场景包括实时聊天、实时通知、在线游戏等。

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('message', (message) => {
    console.log(`收到消息:${message}`);
    io.emit('message', message); // 广播消息给所有连接的客户端
  });

  socket.on('disconnect', () => {
    console.log('客户端断开连接');
  });
});

server.listen(3000, () => {
  console.log('服务器正在监听端口 3000');
});

13. 请求体解析

在 Express.js 中,请求体解析是指将来自客户端的请求数据解析成 JavaScript 对象,以便在路由处理函数中进行处理。Express.js 提供了不同的中间件来处理不同类型的请求数据,包括 JSON 数据和表单数据。

  • 处理 JSON 数据:使用 express.json() 中间件来解析 JSON 请求体。
const express = require('express');
const app = express();

app.use(express.json());

app.post('/api/data', (req, res) => {
  const jsonData = req.body; // 解析后的 JSON 数据
  // 处理 JSON 数据
});

  • 处理表单数据:使用 express.urlencoded() 中间件来解析表单数据。
app.use(express.urlencoded({ extended: true }));

app.post('/api/form', (req, res) => {
  const formData = req.body; // 解析后的表单数据
  // 处理表单数据
});

这些中间件将请求体数据解析为 JavaScript 对象,使您可以轻松地处理和操作它们。

14. 包装回调函数(Promisify)

Node.js 中的包装回调函数是将具有回调风格的函数转换为返回 Promise 的函数的过程。这使得可以更容易地使用异步函数和 async/await 语法进行编程,同时具有更好的错误处理能力。

例如,Node.js 内置的 fs 模块提供了回调风格的文件操作函数,您可以使用 util.promisify 来将它们包装成 Promise 风格的函数:

const fs = require('fs');
const util = require('util');
const readFileAsync = util.promisify(fs.readFile);

readFileAsync('file.txt', 'utf8')
  .then((data) => {
    console.log(data);
  })
  .catch((err) => {
    console.error(err);
  });

util.promisify 会将回调函数包装成返回 Promise 的函数,这样您可以更方便地使用 async/await 处理异步操作。

15. 事件发射器(EventEmitter)模式

Node.js 的事件发射器模式是一种用于处理事件和异步操作的设计模式。它在实际应用中用于以下方面:

  • 自定义事件:您可以创建自己的事件发射器类,并定义事件类型。这在构建可扩展的应用程序时非常有用,因为它允许不同的组件在事件触发时相应地做出响应。
  • 异步通知:事件发射器允许对象在异步操作完成时通知观察者或订阅者。例如,在文件读取完成后触发一个事件通知。
  • 解耦组件:事件发射器可以用于解耦应用程序组件,使它们不需要直接依赖于彼此的实现细节,从而提高代码的可维护性和可测试性。

一个常见的内置事件发射器是 Node.js 的 EventEmitter 类,您可以继承它来创建自己的事件发射器。例如,一个简单的事件发射器用于处理文件读取完成事件:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on('fileRead', (data) => {
  console.log('文件读取完成:', data);
});

// 模拟文件读取操作
setTimeout(() => {
  myEmitter.emit('fileRead', '文件内容...');
}, 1000);

在上述示例中,MyEmitter 类继承自 EventEmitter,并用于触发和处理自定义事件。

16. Event Loop 阶段

Node.js 的 Event Loop 有几个阶段,每个阶段都负责不同类型的任务。这些阶段包括:

  1. Timers(定时器):处理定时器和 setTimeout 回调函数。
  2. Pending Callbacks(挂起的回调):用于执行延迟到下一个循环迭代的 I/O 回调函数。
  3. Idle, Prepare(空闲,准备):仅在内部使用,无需关心。
  4. Poll(轮询):等待新的 I/O 事件,如文件读取、网络请求等。
  5. Check(检查):执行 setImmediate 回调函数。
  6. Close Callbacks(关闭回调):处理关闭事件,例如 socket.on('close', ...)

Event Loop 在这些阶段之间循环运行,每个阶段执行相应的任务。当一个阶段的任务全部完成后,Event Loop 会移动到下一个阶段。这个过程会不断重复,使得 Node.js 能够处理异步操作和事件。

17. 大规模文件上传和下载

对于大规模文件上传和下载,Node.js 提供了一种流式处理的方式,以避免内存溢出。您可以使用可读流(Readable Stream)来逐块地读取上传的文件,然后使用可写流(Writable Stream)将数据写入目标文件或发送给客户端。

以下是一个使用 Express.js 处理文件上传的示例:

const express = require('express');
const multer = require('multer'); // 处理文件上传的中间件
const fs = require('fs');
const app = express();

// 配置文件上传
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'uploads/');
  },
  filename: (req, file, cb) => {
    cb(null, file.originalname);
  },
});

const upload = multer({ storage });

// 处理文件上传
app.post('/upload', upload.single('file'), (req, res) => {
  res.send('文件上传成功');
});

app.listen(3000, () => {
  console.log('服务器正在监听端口 3000');
});

在上述示例中,使用 multer 中间件处理文件上传,它会将文件逐块保存到服务器上的磁盘,而不会将整个文件加载到内存中。

18. 可读流和可写流

可读流和可写流是 Node.js 中的流式处理机制的核心组件。它们用于高效地处理数据流,例如文件读取、网络传输、数据处理等。

一些使用案例包括:

  • 文件读取:使用可读流逐行读取大型日志文件,而不必一次性加载整个文件。
  • HTTP 响应:在服务器响应中使用可写流,逐块地发送响应数据给客户端。
  • 数据转换:使用可读流和可写流来执行数据转换,例如压缩、解压缩、加密、解密等。
  • 网络传输:在网络通信中使用可读流和可写流来处理数据的传输和接收。

流使得处理大型数据变得更加高效和可控,同时减少内存使用。

19. 管理环境变量

在 Node.js 中,可以使用 process.env 来访问环境变量。环境变量通常用于存储配置信息、敏感数据、数据库连接字符串等。

一些最佳实践包括:

  • 将敏感信息存储在环境变量中,而不是硬编码在代码中。
  • 使用 .env 文件或配置管理工具来管理不同环境下的变量。
  • 使用 dotenv 包来加载 .env 文件中的变量。
  • 在生产环境中确保敏感信息的安全性,例如使用环境变量管理工具或服务器配置。

20. 性能分析工具

Node.js 提供了一些内置和第三方工具来进行性能分析:

  • V8 Profiler:内置于 Node.js 中的性能分析工具,可用于分析代码的性能瓶颈。
  • npm 包:有很多第三方调试和性能分析工具,例如 debug 包、nodemonpm2 等,可以根据需要选择合适的工具。

性能分析工具有助于查找和解决应用程序中的问题,优化性能,并提供更好的用户体验。使用这些工具,可以更深入地了解应用程序的运行情况并进行必要的优化。文章来源地址https://www.toymoban.com/news/detail-727136.html

到了这里,关于node.js知识系列(2)-每天了解一点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue.js知识点学习的一点笔记

    目录 一、虚拟DOM  二、MVVM 三、数据代理 四、事件修饰 五、键盘事件 六、插值语法{{}}、方法methods、计算属性computed 七、 监视、深度监视、另一种写法、简写 八、computed计算属性和watch侦听 九、什么时候用箭头函数 十、Vue侦听和watch侦听原理 十一、从Vue侦听原理得出,往对

    2024年02月11日
    浏览(33)
  • 每天10个前端小知识 <Day 8>

    函数缓存,就是将函数运算过的结果进行缓存。本质上就是用空间(缓存存储)换时间(计算过程), 常用于缓存数据计算结果和缓存对象。缓存只是一个临时的数据存储,它保存数据,以便将来对该数据的请求能够更快地得到处理。 实现函数缓存 主要依靠闭包、柯里化、

    2024年02月21日
    浏览(24)
  • JavaScript知识系列(2)每天10个小知识点

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! 在 JavaScript 中,如果您尝试使用 new 来实例化(创建对象)一个箭头函数,会导致运行时错误。箭头函数与普通函数(使用 function 声明的函数)

    2024年02月09日
    浏览(32)
  • Angular知识点系列(1)-每天10个小知识

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! Angular是一个前端开发框架,基于MVC(Model-View-Controller)架构。它的工作原理如下: 模块化架构: Angular应用被组织成模块,每个模块包含组件、服务、指令

    2024年02月07日
    浏览(36)
  • Vue知识系列(1)每天10个小知识点

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! Vue.js 中的修饰符是一种用于改变指令行为的特殊标记,它们可以用于指令的事件监听和双向数据绑定。修饰符以点号的形式添加到指令之后。以下是有关V

    2024年02月09日
    浏览(34)
  • Vue知识系列(7)每天10个小知识点

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! Vue 的过滤器(Filters)是一种用来处理文本格式化的功能。它们允许你在插值表达式 {{ }} 中使用管道符 | ,将数据经过一系列的处理后再显示在视图中。以下

    2024年02月07日
    浏览(46)
  • Angular知识点系列(5)-每天10个小知识

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! 继续回答您的问题: Angular的路由守卫是用于保护导航的守卫,可以控制路由的进入和退出。我对路由守卫有以下理解: CanActivate :决定是否允许导航到某个

    2024年02月07日
    浏览(54)
  • css知识学习系列(11)-每天10个知识点

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! 使用 position 属性可以定义元素的定位方式,如 position: relative; 、 position: absolute; 等。 使用 z-index 属性可以定义元素在层叠上下文中的层级关系,值较大的元

    2024年02月07日
    浏览(25)
  • css知识学习系列(15)-每天10个知识点

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! transition 属性用于创建元素状态变化的平滑过渡效果。您可以指定要过渡的属性、持续时间和过渡类型。 示例: transition: width 0.5s ease; 会使元素的宽度在0.

    2024年02月07日
    浏览(34)
  • css知识学习系列(16)-每天10个知识点

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! margin 是元素外边距,用于控制元素与其周围元素之间的间距,影响元素与其他元素的距离。 padding 是元素内边距,用于控制元素内部内容与元素边框之间的

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包