Node.js 提供了一套丰富的内置 API,构成了该平台应用程序开发的基础。本页概述了主要的 Node.js API 及其常见设计原则。有关特定 API 模块的详细文档,请参阅其各自的页面(文件系统、流、HTTP 和网络、加密、URL 处理 等)。
Node.js API 在整个平台遵循几个一致的设计原则
默认异步:大多数 API 提供异步、非阻塞版本作为其主要接口,并在适当的时候提供同步替代方案。
多种接口风格:API 通常提供多种方式来访问相同的功能
错误优先回调:在基于回调的 API 中,第一个参数始终保留给错误对象(如果无错误则为 null)。
流式接口:复杂的数据操作设计为与 Node.js 流一起使用,以实现高效的内存使用。
事件驱动架构:许多组件扩展了 EventEmitter 类以处理异步事件。
来源:lib/fs.js130-148 doc/api/fs.md1-36 doc/api/stream.md8-27 doc/api/events.md11-35
Node.js 核心 API 采用分层架构,连接 JavaScript 和较低级别的系统操作。
来源:lib/fs.js42-146 src/node_file.cc57-145 lib/internal/fs/utils.js29-40 lib/internal/bootstrap/node.js1-18
Node.js API 一致地实现了多种接口模式,为不同的用例提供灵活性
Node.js 支持三种主要的异步操作模式
| 模式 | 示例 | 优点 | 缺点 |
|---|---|---|---|
| 回调 | fs.readFile(path, (err, data) => {...}) | 传统的 Node.js 模式 | 回调嵌套复杂度 |
| Promise | fs.promises.readFile(path).then(...) | 与 async/await 配合使用,更好的错误处理 | 开销略高 |
| 同步 | fs.readFileSync(path) | 易于使用 | 会阻塞事件循环 |
来源:doc/api/fs.md37-122 lib/fs.js196-252 lib/internal/fs/promises.js3-44
fs)文件系统模块提供了一个与文件系统交互的 API,该 API 紧密模仿了标准的 POSIX 函数。
主要特性
require('node:fs'))、基于 Promise 的(require('node:fs/promises'))和同步的(方法名以“Sync”结尾)来源:doc/api/fs.md1-36 lib/fs.js130-148 lib/internal/fs/promises.js1-112
Stream API 为处理流式数据提供了一个抽象。流可以是可读的、可写的,或两者兼有,所有流实例都是 EventEmitters。
关键流类型
fs.createReadStream())fs.createWriteStream())net.Socket)zlib.createDeflate())来源:doc/api/stream.md8-45 lib/internal/streams/operators.js1-5
Node.js 提供了一套用于网络通信的模块,其中 HTTP 是最常用的模块之一。
关键网络模块
HTTP 模块架构包含客户端和服务器组件
来源:doc/api/http.md8-38 lib/_http_server.js22-44 lib/_http_outgoing.js1-3 lib/_http_client.js1
The crypto 模块提供加密功能,实现了 OpenSSL 的哈希、HMAC、加密、解密、签名和验证函数。
主要功能
来源:doc/api/crypto.md9-35 doc/api/tls.md9-54
EventEmitter 是许多 Node.js API 的基础组件。它实现了观察者模式,允许对象订阅和发出命名事件。
Buffer 类提供了一种在 JavaScript 运行时中直接处理二进制数据的方法。它是 Uint8Array 的一个子类,增加了用于处理二进制数据的常见用例的方法。
主要功能
Buffer.alloc()、Buffer.from()大多数 Node.js 核心模块都提供多种接口风格,以适应不同的编码模式。
// Callback style
fs.readFile('/path/to/file', (err, data) => {
if (err) throw err;
console.log(data);
});
// Promise style
fs.promises.readFile('/path/to/file')
.then(data => console.log(data))
.catch(err => console.error(err));
// Async/await with promises
async function readFile() {
try {
const data = await fs.promises.readFile('/path/to/file');
console.log(data);
} catch (err) {
console.error(err);
}
}
// Synchronous style
try {
const data = fs.readFileSync('/path/to/file');
console.log(data);
} catch (err) {
console.error(err);
}
来源:doc/api/fs.md37-122 lib/fs.js196-252 lib/internal/fs/promises.js3-44
Node.js API 在不同的接口风格中一致地处理错误。
| API 样式 | 错误处理机制 |
|---|---|
| 回调 | 回调函数的第一个参数 ((err, result) => {}) |
| Promise | 拒绝的 Promise (.catch() 或带 await 的 try/catch) |
| 同步 | 抛出的异常(必须使用 try/catch) |
| EventEmitter | 'error' 事件 (emitter.on('error', (err) => {})) |
| 流 | 'error' 事件(从 EventEmitter 继承) |
来源: doc/api/events.md11-55 lib/internal/errors.js doc/api/fs.md65-95
Node.js 有一个正式的弃用机制,可以帮助开发者逐步淘汰过时的 API。
弃用类型
process.on('warning') 事件弃用标志控制警告行为
--no-deprecation:静默所有弃用警告--throw-deprecation:将警告转换为错误--trace-deprecation:在警告时显示堆栈跟踪来源: doc/api/deprecations.md1-50 doc/api/util.md219-327 lib/util.js1-44 lib/internal/util.js1-40
process 对象提供有关当前 Node.js 进程的信息和控制,而实用函数提供常用操作。
全局 process 对象是全局对象,提供有关当前 Node.js 进程的信息和控制。
关键进程特性
process.env、process.versionprocess.stdin、process.stdout、process.stderrprocess.exit()、process.kill()process.on('uncaughtException')、process.on('exit')process.cwd()、process.chdir()来源: doc/api/process.md9-40 src/node_process_methods.cc1-4
util 模块支持 Node.js 内部 API 的需求,并为应用程序开发者提供实用函数。
关键实用程序特性
util.format()、util.inspect()util.promisify()util.deprecate()util.debuglog()来源: doc/api/util.md1-22 lib/util.js1-44 src/node_util.cc1-5
Node.js 提供了处理 URL 和文件路径的模块,这对于网络和文件操作至关重要。
url 模块提供了 URL 解析和解析的实用程序,具有两个 API。
new URL()url.parse()path 模块提供了处理文件和目录路径的实用程序,并具有特定于平台的实现来处理 Windows 和 POSIX 系统之间的差异。
主要功能
path.join()、path.resolve()、path.normalize()path.dirname()、path.basename()、path.extname()path.isAbsolute()、path.parse()、path.format()来源: lib/path.js
Node.js 核心 API 遵循一致的设计模式,同时在各种领域提供强大的功能。 JavaScript 接口与原生性能相结合,为构建可扩展的网络应用程序提供了强大的平台。
理解 API 的常见模式——例如错误处理、多种接口风格和事件驱动架构——可以更容易地学习新的 Node.js API,因为这些模式在整个系统中反复出现。