一文掌握nodejs中的核心概念

1. 事件循环与非阻塞 I/O

概述: 允许 Node.js 在单线程的情况下执行非阻塞 I/O 的机制。

组成部分:

  • 调用栈: 执行同步代码。
  • 回调队列: 存放在异步操作完成后等待执行的回调函数。
  • 事件循环: 检查调用栈是否为空,然后从回调队列中获取回调函数。

重要函数:

  • process.nextTick(): 将回调函数放入单独的队列中,在下一个事件循环周期之前运行。
  • setImmediate(): 将回调函数排入下一个事件循环周期中执行。
  • 含义: 了解这一点有助于优化应用程序性能,并避免潜在的问题。
const fs = require('fs');  
fs.readFile('./file.txt', (err, data) => {  
if (err) throw err;  
console.log(data);  
});  
console.log('正在读取文件…');

2. 缓冲区

概述: V8 堆之外的原始内存分配。

用途:

  • 读取或写入文件系统。
  • 处理来自网络协议的二进制数据。
  • 通用的二进制数据操作。

重要方法:

  • 创建: Buffer.alloc()Buffer.from()
  • 访问和修改: buf.readUInt8()buf.writeUInt8()
  • 转换: buf.toString()
const buf = Buffer.from('Hello, Node.js', 'utf-8');  
console.log(buf); // 输出原始缓冲区数据。

3. 流

概述: 用于流式数据的抽象。

类型:

  • 可读流: 用于数据消耗(例如 fs.createReadStream())。
  • 可写流: 用于数据生产(例如 fs.createWriteStream())。
  • 双工流: 可读可写。
  • 转换流: 在读取和写入时可以修改数据。

关键事件:

  • data:当块可用时。
  • end:没有更多的数据可读取。
  • error:发生错误时。
  • finish:写入完成。
const fs = require('fs');  
const readStream = fs.createReadStream('./largeFile.txt', 'utf8');  
readStream.on('data', chunk => {  
console.log(chunk);  
});

4. 错误处理

  • 同步代码:使用 try...catch
  • 异步代码:
    • 对于回调函数:将错误作为第一个参数传递。
    • 对于 Promise:使用 .catch() 或在 async/await 中使用 try...catch

事件监听器:

  • process.on('uncaughtException'):捕获未捕获的异常。
  • process.on('unhandledRejection'):捕获未处理的 Promise 拒绝。
process.on('uncaughtException', (err) => {  
console.error('发生了一个未捕获的错误', err);  
process.exit(1); // 退出进程  
});  
throw new Error('这将被捕获。');

5. 集群

  • 它们是什么:利用多核系统的一种方式。
  • 主-工作器架构:
    • 主:创建工作进程。
    • 工作器:执行应用程序逻辑。
  • 方法:
    • cluster.fork():生成一个新的工作器。
    • worker.send():在主和工作器之间通信。
  • 事件: onlineexitdisconnect
const cluster = require('cluster');  
const http = require('http');  
const numCPUs = require('os').cpus().length;if (cluster.isMaster) {  
for (let i = 0; i < numCPUs; i++) {  
cluster.fork();  
}  
} else {  
http.createServer((req, res) => {  
res.writeHead(200);  
res.end('来自集群的问候!');  
}).listen(8000);  
}

6. Promises & Async/Await

  • Promises:
    • 状态: pendingfulfilledrejected
    • 方法: then()catch()finally()
    • 创建: new Promise((resolve, reject) => {...})
  • Async/Await:
    • 用法: async function() { await someAsyncFunction(); }
    • 错误处理:用于异步错误的 try...catch
const promiseFunc = () => {  
return new Promise((resolve, reject) => {  
setTimeout(() => resolve('2 秒后解决'), 2000);  
});  
};async function asyncFunc() {  
const result = await promiseFunc();  
console.log(result);  
}asyncFunc();

7. Node.js 中的 ES 模块 (ESM)

  • 语法:
    • 导入: import module from 'path'
    • 导出: export default module
  • 特点:使用 import() 进行动态导入。
  • 与 CommonJS 的比较:ESM 是异步的,具有静态结构,并支持树摇。
// math.js  
export const add = (a, b) => a + b;// main.js  
import { add } from './math.js';  
console.log(add(2, 3)); // 输出 5

8. 内存管理

  • 垃圾收集:V8 的机制,用于释放未使用的内存。
  • 堆快照:提供堆在特定时点的状态。
  • 内存泄漏:即使不再需要,内存仍未释放的情况。
  • 标识:像 node-inspectheapdump 这样的工具。
  • 常见原因:全局变量,未移除的事件监听器。

9. 中间件模式(使用 Express.js)

义:拦截请求和响应的函数。

  • 用法: app.use(middlewareFunction)
  • 顺序:中间件顺序很重要;它们按顺序执行。
  • 内置中间件: express.staticexpress.json()
  • 自定义中间件: function(req, res, next) {...}
const express = require('express');  
const app = express();const requestTimeMiddleware = (req, res, next) => {  
req.requestTime = Date.now();  
next();  
};app.use(requestTimeMiddleware);app.get('/', (req, res) => {  
res.send(`请求时间:${req.requestTime}`);  
});app.listen(3000);

10. 依赖注入(DI)

  • 定义:对象从外部接收它们的依赖关系的模式。
  • 好处:解耦,可测试性。
  • 实现:像 NestJS 这样的框架有 DI 容器。
import { Injectable, Inject } from '@nestjs/common';@Injectable()  
export class CatsService {  
constructor(@Inject('DATABASE_CONNECTION') private dbConnection) {}findAll() {  
return this.dbConnection.query('SELECT * FROM cats');  
}  
}

11. Node.js 中的微服务

  • 定义:将应用程序拆分为小型服务的架构。
  • 通信:
    • 同步:HTTP/REST。
    • 异步:消息代理(例如 RabbitMQ)。
  • 优势:可扩展性,可维护性。

12. 分析和性能优化

  • 分析工具:node --inspect,Chrome DevTools。
  • 优化:识别瓶颈,重构和测量。
  • 监控:像 PM2 这样的工具用于实时监控。
node — inspect server.js

13. N-API 和原生插件

  • 定义:使用 C/C++ 扩展 Node.js。
  • 用途:与 C/C++ 库集成或性能关键任务时使用。
  • 构建:像 node-gyp 这样的工具。

14. 使用 npm/yarn 进行包管理

  • 依赖关系:在 package.json 中定义。
  • 版本管理:语义化版本控制(例如 ^1.0.0)。
  • 脚本:在 package.json 中的自动化脚本,如 starttest

15. 安全实践

  • 最佳实践:
    • 定期更新依赖项。
    • 使用 HTTPS。
    • 清理输入。
    • 速率限制。
  • 中间件:Helmet.js 用于安全头。
  • 身份验证:OAuth,JWT。
const express = require('express');  
const helmet = require('helmet');const app = express();app.use(helmet());app.listen(3000);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/835425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WHAT - 浏览器缓存机制系列(二)

目录 一、介绍二、强缓存三、协商缓存今天主要介绍 HTTP请求缓存中的强缓存和协商缓存。 一、介绍 浏览器每次发起请求时,会先在浏览器缓存中查找请求的缓存结果和缓存标识。 当浏览器第一次向服务器发起请求后,浏览器缓存肯定是没有对应缓存的,所以向服务器发起请求,服…

AI换人视频制作

AI换人视频制作 举例&#xff1a; 让潘金莲和唐僧一起让奥特曼打孙悟空 工具 需要魔法上网自行百度https://discord.com/invite/viggle接受邀请后进入频道 输入 / 选择mix 选择mix 分别上传对应的图片 和视频 选择 背景设置为 白色 和fintune 为on等待几分钟 搜索 下载对应视…

实现WPF中的数据更新 属性通知界面:INotifyPropertyChanged接口

在WPF (Windows Presentation Foundation) 应用程序中&#xff0c;当数据发生变化时&#xff0c;通常希望UI能够自动更新以反映这些变化。为了实现这一功能&#xff0c;WPF 提供了数据绑定机制&#xff0c;并且配合 INotifyPropertyChanged 接口使用&#xff0c;可以在数据模型…

docker安装与重装

docker安装与重装 docker安装 https://blog.csdn.net/lyqhf153/article/details/79585976 参考上面的方式 cat /etc/issueuname -r uname -acat /proc/versiondf -hyum list docker-ce --showduplicates | sort -r 查看docker-ce的版本列表sudo yum install -y docker 没有…

Mesa3D图形库与NIR(New Intermediate Representation)

Mesa 是一个开源图形库&#xff0c;为 Unix 和 Linux 系统提供了 OpenGL 和 Vulkan API 的实现。它也支持其他图形 API&#xff0c;如OpenCL、OpenGL ES 和 Vulkan。Mesa 项目的目标是为开源社区提供高性能的图形库&#xff0c;使得开源操作系统能够充分利用现代图形硬件。 Me…

containerd的原理及应用详解(一)

本系列文章简介: 随着容器技术的迅猛发展,容器运行时成为了关注的焦点之一。而容器运行时的核心组件之一就是containerd。containerd是一个高度可扩展的容器运行时,它负责管理容器的生命周期、镜像管理以及资源隔离等核心功能。它是由Docker团队开发并开源的,目前已经成为了…

企业活动想联系媒体报道宣传如何联系媒体?

在企业的宣传推广工作中,我曾经历过一段费事费力、效率极低的时期。那时,每当公司有重要活动或新项目需要媒体报道时,我便要一家家地联系媒体,发送邮件、打电话,甚至亲自登门拜访,只为求得一篇报道。然而,这样的过程充满了不确定性和挑战,时常让我感到焦虑和压力山大。 记得有一…

C——单链表

一.前言 我们在前面已经了解了链表中的双向链表&#xff0c;而我们在介绍链表分类的时候就说过常用的链表只有两种——双向带头循环链表和单向不带头不循环链表。下来我来介绍另一种常用的链表——单向不带头不循环链表也叫做单链表。不清楚链表分类的以及不了解双向链表的可以…

【数据结构】第五讲:栈和队列

个人主页&#xff1a;深情秋刀鱼-CSDN博客 数据结构专栏&#xff1a;数据结构与算法 源码获取&#xff1a;数据结构: 上传我写的关于数据结构的代码 (gitee.com) 目录 一、栈 1.栈的定义 2.栈的实现 a.栈结构的定义 b.初始化 c.扩容 d.入栈 e.出栈 f.打印 g.取栈顶元素…

Java中常用类String的构造器与常用方法

Java中常用类String的构造器与常用方法 在Java编程中&#xff0c;String类是一个核心类&#xff0c;用于处理文本数据。掌握String类的构造器和常用方法对于编写涉及文本操作的程序至关重要。本文将为初学者介绍String类的一些常用构造器和常用方法&#xff0c;并通过示例代码…

Git 进行项目开发时新建一个分支作为备份

在使用 Git 进行项目开发时&#xff0c;想要在当前的 master 或其它分支基础上进行代码优化或修改时&#xff0c;并且在优化过程中保留一个当前状态的备份&#xff08;即新建一个分支作为备份&#xff09;&#xff0c;然后继续在 master 分支上开发&#xff0c;你可以按照以下步…

乐观锁、悲观锁、互斥锁、读写锁

乐观锁和悲观锁是两种不同的锁机制&#xff0c;用于在多线程环境下解决资源竞争问题。互斥锁和读写锁是两种常见的锁类型&#xff0c;它们都可以用来实现乐观锁或悲观锁。 乐观锁 是一种无锁机制&#xff0c;它假设在多线程环境下对共享资源的操作不会发生冲突&#xff0c;因…

【CTF Crypto】XCTF GFSJ0522 base64 Writeup(Base64编码)

base64 元宵节灯谜是一种古老的传统民间观灯猜谜的习俗。 因为谜语能启迪智慧又饶有兴趣&#xff0c;灯谜增添节日气氛&#xff0c;是一项很有趣的活动。 你也很喜欢这个游戏&#xff0c;这不&#xff0c;今年元宵节&#xff0c;心里有个黑客梦的你&#xff0c;约上你青梅竹马…

Git泄露(续)

接上一篇补充 git config --global user.name " " git config --global user.email 邮箱地址 配置用户名和邮箱 git commit 使其处于交互区&#xff0c;没有使用 -m&#xff0c;默认用vim 来编辑和提交信息 输入要提交的内容&#xff0c;然后按ESC建回到命令…

华纳云:美国服务器的几种防火墙类型介绍

美国服务器的防火墙主要是用于在系统的内外网之间构建一道相对隔绝的保护屏障&#xff0c;用来保障美国服务器的网络安全免受恶意流量的影响&#xff0c;与其他地区的服务器并无本质上的不同&#xff0c;通常可以使用以下几种类型的防火墙&#xff1a; 软件防火墙&#xff1a;软…

「 网络安全常用术语解读 」通用配置枚举CCE详解

1. 背景介绍 NIST提供了安全内容自动化协议&#xff08;Security Content Automation Protocol&#xff0c;SCAP&#xff09;为漏洞描述和评估提供一种通用语言。SCAP组件包括&#xff1a; 通用漏洞披露(Common Vulnerabilities and Exposures, CVE)&#xff1a;提供一个描述…

泰迪智能科技企业数据挖掘流程分析及特色服务优势

企业发展会沉淀大量的数据&#xff0c;数据中囊括了企业业务各种维度指标&#xff0c;通过数据挖掘和数据分析 &#xff0c;让企业业务了解过去、现在和未来将要发生什么&#xff0c;从而更好的调整企业发展方向。泰迪智能科技企业数据挖掘平台是面向企业级用户快速处理数据构建…

C++学习第二十八课:C++ 中的智能指针详解

在 C 中&#xff0c;内存管理是每个程序员都需要面对的问题。在处理动态分配的内存时&#xff0c;如果忘记释放内存&#xff0c;可能会导致内存泄漏。为了解决这个问题&#xff0c;C11 引入了智能指针的概念。本文将详细介绍 C 中使用智能指针的方法&#xff0c;并结合实际案例…

并查集刷题笔记

leetcode-1971:寻找图中是否存在路径 并查集可以解决的问题是&#xff1a;判断两个点是否在同一个集合之中 并查集模版&#xff1a; 最重要的两部&#xff1a;将两点连接以及对某一节点寻根。 一、初始化&#xff1a;{init()} 将每个节点的父节点初始化为自身。 二、寻根…

nvm安装踩雷 报错‘node‘ 不是内部或外部命令

需要排查以下内容&#xff1a; 1.nvm install node版本号后使用nvm use node版本号进行应用 2.在安装nvm前&#xff0c;确保电脑上不存在之前安装过的node的相关信息&#xff0c;包括环境变量、之前安装的nodejs、node_global文件夹&#xff08;存储全局安装的 Node.js 模块和…