已弃用的 API
History
Node.js API 可能因以下任何原因被弃用:
- 使用该 API 不安全。
- 有改进的替代 API 可用。
- 预计在未来的主要版本中会对 API 进行破坏性更改。
Node.js 使用四种弃用方式:
- 仅文档
- 应用程序(仅限非
node_modules代码) - 运行时(所有代码)
- 生命周期结束
仅文档弃用是指仅在 Node.js API 文档中表达的弃用。这些在运行 Node.js 时不会产生副作用。某些仅文档弃用在启动时带有 --pending-deprecation 标志(或其替代方案,NODE_PENDING_DEPRECATION=1 环境变量)会触发运行时警告,类似于下面的运行时弃用。支持该标志的仅文档弃用在 已弃用 API 列表 中会明确标注。
默认情况下,仅针对非 node_modules 代码的应用程序弃用会在首次于非 node_modules 加载的代码中使用弃用 API 时生成一个进程警告并打印到 stderr。当使用 --throw-deprecation 命令行标志时,运行时弃用将导致抛出错误。当使用 --pending-deprecation 时,警告也会为从 node_modules 加载的代码发出。
所有代码的运行时弃用类似于非 node_modules 代码的运行时弃用,不同之处在于它也会为从 node_modules 加载的代码发出警告。
当功能正在或即将从 Node.js 中移除时,会使用生命周期结束弃用。
偶尔,API 的弃用可能会被撤销。在这种情况下,本文档将更新与决策相关的信息。但是,弃用标识符不会被修改。
OutgoingMessage.prototype.flush() 已被移除。请改用 OutgoingMessage.prototype.flushHeaders()。
_linklist 模块已弃用。请使用用户空间的替代方案。
_writableState.buffer 已被移除。请改用 _writableState.getBuffer()。
CryptoStream.prototype.readyState 属性已被移除。
node_modules code only)Buffer() 函数和 new Buffer() 构造函数因 API 可用性问题可能导致意外的安全问题而被弃用。
作为替代,请使用以下构造 Buffer 对象的方法之一:
Buffer.alloc(size[, fill[, encoding]]):创建具有_已初始化_内存的Buffer。Buffer.allocUnsafe(size):创建具有_未初始化_内存的Buffer。Buffer.allocUnsafeSlow(size):创建具有_未初始化_内存的Buffer。Buffer.from(array):创建具有array副本的BufferBuffer.from(arrayBuffer[, byteOffset[, length]])- 创建包装给定arrayBuffer的Buffer。Buffer.from(buffer):创建复制buffer的Buffer。Buffer.from(string[, encoding]):创建复制string的Buffer。
如果没有 --pending-deprecation,运行时警告仅发生在不在 node_modules 中的代码。这意味着依赖项中的 Buffer() 用法不会有弃用警告。使用 --pending-deprecation 时,无论 Buffer() 用法出现在何处,都会产生运行时警告。
在 child_process 模块的 spawn()、fork() 和 exec() 方法中,options.customFds 选项已弃用。应改用 options.stdio 选项。
在早期版本的 Node.js cluster 中,一个名为 suicide 的布尔属性被添加到 Worker 对象。该属性的目的是指示 Worker 实例如何以及为何退出。在 Node.js 6.0.0 中,旧属性被弃用并替换为新的 worker.exitedAfterDisconnect 属性。旧属性名称并未精确描述实际语义,且带有不必要的情感色彩。
node:constants 模块已弃用。当需要访问与特定 Node.js 内置模块相关的常量时,开发者应参考相关模块暴露的 constants 属性。例如,require('node:fs').constants 和 require('node:os').constants。
在 Node.js 6.0 中,未指定 digest 使用 crypto.pbkdf2() API 已被弃用,因为该方法默认使用不推荐的 'SHA1' digest。此前,会打印弃用警告。从 Node.js 8.0.0 开始,使用 digest 设置为 undefined 调用 crypto.pbkdf2() 或 crypto.pbkdf2Sync() 将抛出 TypeError。
从 Node.js 11.0.0 开始,使用 digest 设置为 null 调用这些函数将打印弃用警告,以与 digest 为 undefined 时的行为保持一致。
但现在,传递 undefined 或 null 都将抛出 TypeError。
crypto.createCredentials() API 已被移除。请改用 tls.createSecureContext()。
crypto.Credentials 类已被移除。请改用 tls.SecureContext。
Domain.dispose() 已被移除。请改为通过设置在域上的错误事件处理程序显式地从失败的 I/O 操作恢复。
从 Node.js 10.0.0 开始,调用不带回调的异步函数会抛出 TypeError。参见 https://github.com/nodejs/node/pull/12562。
fs.read() 遗留 String 接口已弃用。请改用文档中提到的 Buffer API。
fs.readSync() 遗留 String 接口已弃用。请改用文档中提到的 Buffer API。
global 属性的 GLOBAL 和 root 别名在 Node.js 6.0.0 中被弃用,此后已被移除。
Intl.v8BreakIterator 是一个非标准扩展,已被移除。参见 Intl.Segmenter。
未处理的 Promise 拒绝已弃用。默认情况下,未处理的 Promise 拒绝会以非零退出码终止 Node.js 进程。要更改 Node.js 处理未处理拒绝的方式,请使用 --unhandled-rejections 命令行选项。
在某些情况下,require('.') 可能解析到包目录外部。此行为已被移除。
Server.connections 属性在 Node.js 0.9.7 中被弃用,此后已被移除。请改用 Server.getConnections() 方法。
DEP0021: Server.listenFD
History
Server.listenFD() 方法已弃用并被移除。请改用 Server.listen({fd: <number>})。
os.tmpDir() API 在 Node.js 7.0.0 中被弃用,此后已被移除。请改用 os.tmpdir()。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/tmpDir-to-tmpdiros.getNetworkInterfaces() 方法已弃用。请改用 os.networkInterfaces() 方法。
REPLServer.prototype.convertToContext() API 已被移除。
node:sys 模块已弃用。请改用 util 模块。
DEP0026: util.print()
History
util.print() 已被移除。请改用 console.log()。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-print-to-console-logDEP0027: util.puts()
History
util.puts() 已被移除。请改用 console.log()。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-print-to-console-logDEP0028: util.debug()
History
util.debug() 已被移除。请改用 console.error()。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-print-to-console-logDEP0029: util.error()
History
util.error() 已被移除。请改用 console.error()。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-print-to-console-logSlowBuffer 类已被移除。请改用 Buffer.allocUnsafeSlow(size)。
自动迁移工具可用(来源)。
npx codemod@latest @nodejs/slow-buffer-to-buffer-alloc-unsafe-slowecdh.setPublicKey() 方法现已弃用,因为其在 API 中的包含并无用处。
domain 模块已弃用,不应使用。
The events.listenerCount(emitter, eventName) API was deprecated, as it
provided identical functionality to emitter.listenerCount(eventName). The
deprecation was revoked because this function has been repurposed to also
accept <EventTarget> arguments.
fs.exists(path, callback) API 已弃用。请改用 fs.stat() 或 fs.access()。
DEP0035: fs.lchmod(path, mode, callback)
History
已分配弃用代码。
仅文档弃用。
fs.lchmod(path, mode, callback) API 已弃用。
DEP0036: fs.lchmodSync(path, mode)
History
已分配弃用代码。
仅文档弃用。
fs.lchmodSync(path, mode) API 已弃用。
fs.lchown(path, uid, gid, callback) API 曾被弃用。弃用被撤销,因为必要的支持 API 已添加到 libuv 中。
fs.lchownSync(path, uid, gid) API 曾被弃用。弃用被撤销,因为必要的支持 API 已添加到 libuv 中。
DEP0039: require.extensions
History
已分配弃用代码。
仅文档弃用。
require.extensions 属性已弃用。
node_modules code only)punycode 模块已弃用。请改用用户空间的替代方案。
NODE_REPL_HISTORY_FILE 环境变量已被移除。请改用 NODE_REPL_HISTORY。
DEP0042: tls.CryptoStream
History
tls.CryptoStream 类已被移除。请改用 tls.TLSSocket。
DEP0043: tls.SecurePair
History
tls.SecurePair 类已弃用。请改用 tls.TLSSocket。
util.isArray() API 已弃用。请改用 Array.isArray()。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isBoolean() API 已被移除。请改用 typeof arg === 'boolean'。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isBuffer() API 已被移除。请改用 Buffer.isBuffer()。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isDate() API 已被移除。请改用 arg instanceof Date。
对于更强的方法,考虑使用:
Date.prototype.toString.call(arg) === '[object Date]' && !isNaN(arg)。
这也可用于 try/catch 块中以处理无效的日期对象。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isError() API 已被移除。请改用 Error.isError(arg)。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isFunction() API 已被移除。请改用 typeof arg === 'function'。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isNull() API 已被移除。请改用 arg === null。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isNullOrUndefined() API 已被移除。请改用 arg === null || arg === undefined。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isNumber() API 已被移除。请改用 typeof arg === 'number'。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isObject() API 已被移除。请改用 arg && typeof arg === 'object'。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isPrimitive() API 已被移除。请改用 Object(arg) !== arg。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isRegExp() API 已被移除。请改用 arg instanceof RegExp。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isString() API 已被移除。请改用 typeof arg === 'string'。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isSymbol() API 已被移除。请改用 typeof arg === 'symbol'。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.isUndefined() API 已被移除。请改用 arg === undefined。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-isutil.log() API 已被移除,因为它是一个意外暴露给用户空间的未维护的遗留 API。相反,根据您的具体需求考虑以下替代方案:
-
第三方日志库
-
使用
console.log(new Date().toLocaleString(), message)
通过采用这些替代方案之一,您可以过渡远离 util.log() 并选择符合您应用程序特定要求和复杂性的日志策略。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-log-to-console-logutil._extend() API 已弃用,因为它是一个意外暴露给用户空间的未维护的遗留 API。
请改用 target = Object.assign(target, source)。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/util-extend-to-object-assignfs.SyncWriteStream 类从未打算成为 publicly accessible API,已被移除。没有可用的替代 API。请使用用户空间的替代方案。
--debug 激活遗留的 V8 调试器接口,该接口自 V8 5.8 起已被移除。它已被 Inspector 取代,后者改用 --inspect 激活。
node:http 模块 ServerResponse.prototype.writeHeader() API 已弃用。请改用 ServerResponse.prototype.writeHead()。
ServerResponse.prototype.writeHeader() 方法从未被记录为官方支持的 API。
tls.createSecurePair() API 在 Node.js 0.11.3 的文档中被弃用。用户应改用 tls.Socket。
node:repl 模块的 REPL_MODE_MAGIC 常量(用于 replMode 选项)已被移除。自 Node.js 6.0.0 导入 V8 5.0 以来,其行为在功能上与 REPL_MODE_SLOPPY 相同。请改用 REPL_MODE_SLOPPY。
NODE_REPL_MODE 环境变量用于设置交互式 node 会话的底层 replMode。其值 magic 也被移除。请改用 sloppy。
node:http 模块 OutgoingMessage.prototype._headers 和 OutgoingMessage.prototype._headerNames 属性已弃用。使用公共方法之一(例如 OutgoingMessage.prototype.getHeader()、OutgoingMessage.prototype.getHeaders()、OutgoingMessage.prototype.getHeaderNames()、OutgoingMessage.prototype.getRawHeaderNames()、OutgoingMessage.prototype.hasHeader()、OutgoingMessage.prototype.removeHeader()、OutgoingMessage.prototype.setHeader())来处理传出 header。
OutgoingMessage.prototype._headers 和 OutgoingMessage.prototype._headerNames 属性从未被记录为官方支持的属性。
自动迁移工具可用(来源):
npx codemod@latest @nodejs/http-outgoingmessage-headersnode:http 模块 OutgoingMessage.prototype._renderHeaders() API 已弃用。
OutgoingMessage.prototype._renderHeaders 属性从未被记录为官方支持的 API。
node debug 对应于传统的 CLI 调试器,它已被基于 V8-inspector 的 CLI 调试器取代,后者可通过 node inspect 使用。
DebugContext 已在 V8 中被移除,在 Node.js 10+ 中不可用。
DebugContext 曾是一个实验性 API。
async_hooks.currentId() 已重命名为 async_hooks.executionAsyncId() 以提高清晰度。
此更改是在 async_hooks 作为实验性 API 时进行的。
async_hooks.triggerId() 已重命名为 async_hooks.triggerAsyncId() 以提高清晰度。
此更改是在 async_hooks 作为实验性 API 时进行的。
async_hooks.AsyncResource.triggerId() 已重命名为
async_hooks.AsyncResource.triggerAsyncId() 以提高清晰度。
此更改是在 async_hooks 作为实验性 API 时进行的。
访问 net.Server 实例的几个具有不适当名称的内部、未文档化属性已弃用。
由于原始 API 未文档化且通常对非内部代码无用,因此不提供替代 API。
REPLServer.bufferedCommand 属性已弃用,推荐使用
REPLServer.clearBufferedCommand()。
REPLServer.parseREPLKeyword() 已从用户空间可见性中移除。
tls.parseCertString() 是一个简单的解析辅助函数,被错误地公开了。虽然它应该解析证书主题和颁发者字符串,
但它从未正确处理多值相对区分名称(Relative Distinguished Names)。
本文档的早期版本建议使用 querystring.parse() 作为 tls.parseCertString() 的替代方案。然而,querystring.parse() 也
不能正确处理所有证书主题,不应使用。
Module._debug() 已被移除。
Module._debug() 函数从未被文档化为官方支持的 API。
REPLServer.turnOffEditorMode() 已从用户空间可见性中移除。
在对象上使用名为 inspect 的属性来为 util.inspect() 指定自定义检查函数已弃用。请改用 util.inspect.custom。为了与 6.4.0 版本之前的 Node.js 保持向后兼容,两者都可以指定。
内部 path._makeLong() 并非 intended 供公开使用。然而,
用户空间模块发现它很有用。内部 API 已弃用
并替换为相同的公共 path.toNamespacedPath() 方法。
fs.truncate() fs.truncateSync() 与文件描述符一起使用已
弃用。请使用 fs.ftruncate() 或 fs.ftruncateSync() 来处理
文件描述符。
自动迁移可用(来源):
npx codemod@latest @nodejs/fs-truncate-fd-deprecationREPLServer.prototype.memory() 仅对 REPLServer 本身的内部机制是必要的。不要使用此函数。
tls.createSecureContext() 和 tls.TLSSocket 的 ecdhCurve 选项可以
设置为 false 以仅在服务器上完全禁用 ECDH。此模式已
弃用,以准备迁移到 OpenSSL 1.1.0 并与客户端保持一致,现在不再支持。请改用 ciphers 参数。
自 Node.js 版本 4.4.0 和 5.2.0 以来,几个仅用于
内部使用的模块被错误地通过 require() 暴露给用户代码。这些模块是:
v8/tools/codemapv8/tools/consarrayv8/tools/csvparserv8/tools/logreaderv8/tools/profile_viewv8/tools/profilev8/tools/SourceMapv8/tools/splaytreev8/tools/tickprocessor-driverv8/tools/tickprocessornode-inspect/lib/_inspect(从 7.6.0 开始)node-inspect/lib/internal/inspect_client(从 7.6.0 开始)node-inspect/lib/internal/inspect_repl(从 7.6.0 开始)
v8/* 模块没有任何导出,如果不按特定顺序导入,实际上会抛出错误。因此,通过 require() 导入它们几乎没有合法的用例。
另一方面,node-inspect 可以通过包管理器在本地安装,因为它以相同的名称发布在 npm 注册表上。如果这样做,则无需修改源代码。
AsyncHooks 敏感 API 从未被文档化,并且存在各种小问题。
请改用 AsyncResource API。参见
https://github.com/nodejs/node/issues/15572。
runInAsyncIdScope 不发出 'before' 或 'after' 事件,因此可能导致
很多问题。参见 https://github.com/nodejs/node/issues/14328。
直接导入 assert 不被推荐,因为暴露的函数使用
松散相等性检查。弃用已被撤销,因为使用
node:assert 模块并不受劝阻,且弃用引起了开发者的困惑。
Node.js 曾经支持调用 decipher.setAuthTag() 时 OpenSSL 接受的所有 GCM 身份验证标签长度。从 Node.js
v11.0.0 开始,只允许 128、120、112、104、96、64 和 32
位的身份验证标签长度。其他长度的身份验证标签根据
NIST SP 800-38D 是无效的。
crypto.DEFAULT_ENCODING 属性仅为了与
0.9.3 版本之前的 Node.js 发布版本兼容而存在,现已移除。
将属性分配给顶层 this 作为
module.exports 的替代方案已弃用。开发者应改用 exports
或 module.exports。
crypto.fips 属性已弃用。请改用 crypto.setFips()
和 crypto.getFips()。
自动迁移可用(来源)。
npx codemod@latest @nodejs/crypto-fips-to-getFips使用多个参数调用 assert.fail() 已弃用。请仅使用
一个参数调用 assert.fail() 或使用不同的 node:assert 模块
方法。
timers.enroll() 已被移除。请改用公开文档化的
setTimeout() 或 setInterval()。
timers.unenroll() 已被移除。请改用公开文档化的
clearTimeout() 或 clearInterval()。
添加 domain 属性以携带上下文的 MakeCallback 用户,
应开始使用 MakeCallback 的 async_context 变体或
CallbackScope,或高级 AsyncResource 类。
AsyncHooks 提供的嵌入 API 暴露了 .emitBefore() 和
.emitAfter() 方法,这些方法非常容易被错误使用,从而导致
不可恢复的错误。
请改用 asyncResource.runInAsyncScope() API,它提供了更安全、
更方便的替代方案。参见
https://github.com/nodejs/node/pull/18513。
某些版本的 node::MakeCallback API(可供原生插件使用)已
弃用。请使用接受 async_context 参数的 API 版本。
DEP0100: process.assert()
History
process.assert() 已弃用。请改用 assert 模块。
这从未是一个文档化的功能。
自动迁移可用(来源)。
npx codemod@latest @nodejs/process-assert-to-node-assert--with-lttng 编译时选项已被移除。
使用 noAssert 参数不再有任何功能。无论 noAssert 的值如何,所有输入都会
被验证。跳过验证可能导致难以发现的错误和崩溃。
--pending-deprecation)通常应避免使用 process.binding()。特别是类型检查
方法可以通过使用 util.types 来替换。
此弃用已被 process.binding() API 的弃用所取代 (DEP0111)。
--pending-deprecation)当将非字符串属性分配给 process.env 时,分配的值会
隐式转换为字符串。如果分配的值不是字符串、布尔值或数字,则此行为已弃用。将来,此类分配可能会
导致抛出错误。请在将其分配给 process.env 之前将属性转换为字符串。
decipher.finaltol() 从未被文档化,它是
decipher.final() 的别名。此 API 已被移除,建议使用
decipher.final() 代替。
crypto.createCipher() 和 crypto.createDecipher() 已被移除,
因为它们使用弱密钥派生函数(无盐的 MD5)和静态
初始化向量。
建议使用 crypto.pbkdf2() 或 crypto.scrypt() 与随机盐派生密钥,并使用
crypto.createCipheriv() 和 crypto.createDecipheriv() 分别获取
Cipheriv 和 Decipheriv 对象。
这是一个未文档化的辅助函数,不 intended 供 Node.js 核心之外使用,并且随着 NPN(Next Protocol Negotiation)支持的移除而过时。
zlib.bytesWritten 的已弃用别名。选择这个原始名称是因为
将其值解释为引擎读取的字节数也有意义,但与 Node.js 中
在这些名称下暴露值的其他流不一致。
自动迁移可用(来源)。
npx codemod@latest @nodejs/zlib-bytesread-to-byteswritten一些以前支持(但严格无效)的 URL 被 http.request()、http.get()、https.request()、
https.get() 和 tls.checkServerIdentity() API 接受,因为这些 URL 被传统的 url.parse() API 接受。提到的 API 现在使用 WHATWG
URL 解析器,该解析器需要严格有效的 URL。传递无效 URL 已
弃用,支持将在未来移除。
produceCachedData 选项已弃用。请改用
script.createCachedData()。
--pending-deprecation)process.binding() 仅供 Node.js 内部代码使用。
虽然 process.binding() 通常尚未达到生命周期结束状态,但在启用 [权限模型][] 时不可用。
node:dgram 模块以前包含几个从未 intended
在 Node.js 核心之外访问的 API:Socket.prototype._handle、
Socket.prototype._receiving、Socket.prototype._bindState、
Socket.prototype._queue、Socket.prototype._reuseAddr、
Socket.prototype._healthCheck()、Socket.prototype._stopReceiving() 和
dgram._createSocketHandle()。这些已被移除。
Cipher.setAuthTag() 和 Decipher.getAuthTag() 不再可用。它们
从未被文档化,并且在调用时会抛出错误。
crypto._toBuf() 函数并非 designed 供 Node.js 核心之外的模块使用,已被移除。
--pending-deprecation)在最近版本的 Node.js 中,crypto.randomBytes() 和 crypto.pseudoRandomBytes() 之间没有区别。后者已
弃用,连同未文档化的别名 crypto.prng() 和
crypto.rng() 一起,推荐使用 crypto.randomBytes(),并可能在未来的版本中移除。
[传统 URL API][] 已弃用。这包括 url.format()、
url.parse()、url.resolve() 和 [传统 urlObject][]。请改用 WHATWG URL API。
自动迁移可用(来源)。
npx codemod@latest @nodejs/node-url-to-whatwg-url早期版本的 Node.js 通过 Cipher、Decipher、DiffieHellman、
DiffieHellmanGroup、ECDH、Hash、Hmac、Sign 和 Verify 类的 _handle 属性暴露了内部原生对象的句柄。
_handle 属性已被移除,因为不当使用原生
对象可能导致应用程序崩溃。
早期版本的 Node.js 支持使用假值主机名(如 dns.lookup(false))调用 dns.lookup(),这是出于向后兼容性考虑。此支持已被移除。
--pending-deprecation)process.binding('uv').errname() 已弃用。请改用
util.getSystemErrorName()。
Windows 性能计数器支持已从 Node.js 中移除。
未文档化的 COUNTER_NET_SERVER_CONNECTION()、
COUNTER_NET_SERVER_CONNECTION_CLOSE()、COUNTER_HTTP_SERVER_REQUEST()、
COUNTER_HTTP_SERVER_RESPONSE()、COUNTER_HTTP_CLIENT_REQUEST() 和
COUNTER_HTTP_CLIENT_RESPONSE() 函数已弃用。
未文档化的 net._setSimultaneousAccepts() 函数最初
intended 用于在 Windows 上使用 node:child_process 和 node:cluster 模块时进行调试和性能调优。该函数通常
无用,正在被移除。参见此处的讨论:
https://github.com/nodejs/node/issues/18391
请改用 Server.prototype.setSecureContext()。
RFC 6066 不允许将 TLS ServerName 设置为 IP 地址。
此属性是对实例本身的引用。
node:_stream_wrap 模块已弃用。
以前未文档化的 timers.active() 已被移除。
请改用公开文档化的 timeout.refresh()。
如果需要重新引用超时,timeout.ref() 可以自 Node.js 10 以来使用,且无性能影响。
以前未文档化且“私有”的 timers._unrefActive() 已被移除。
请改用公开文档化的 timeout.refresh()。
如果需要取消引用超时,timeout.unref() 可以自 Node.js 10 以来使用,且无性能影响。
具有无效 main 入口(例如 ./does-not-exist.js)且
在顶层目录中也有 index.js 文件的模块将解析
index.js 文件。这已弃用,并将在未来的
Node.js 版本中抛出错误。
spawn() 和类似函数返回的子进程对象的 _channel 属性不 intended 供公开使用。请改用 ChildProcess.channel。
自动迁移可用(来源):
npx codemod@latest @nodejs/create-require-from-path传统 HTTP 解析器在 12.0.0 版本之前的 Node.js 版本中默认使用,
已弃用并在 v13.0.0 中移除。在 v13.0.0 之前,
可以使用 --http-parser=legacy 命令行标志恢复使用传统解析器。
传递回调给 worker.terminate() 已弃用。请改用返回的
Promise,或监听 worker 的 'exit' 事件。
首选 response.socket 而不是 response.connection,
首选 request.socket 而不是 request.connection。
--pending-deprecation)process._tickCallback 属性从未被文档化为
官方支持的 API。
WriteStream.open() 和 ReadStream.open() 是未文档化的内部
API,在用户空间中使用没有意义。文件流应始终通过其相应的工厂方法 fs.createWriteStream()
和 fs.createReadStream() 打开,或在选项中传递文件描述符。
response.finished 指示是否已调用 response.end(),
而不是是否已发出 'finish' 且底层数据
已刷新。
请相应地改用 response.writableFinished 或 response.writableEnded
以避免歧义。
为了保持现有行为,response.finished 应替换为
response.writableEnded。
允许 fs.FileHandle 对象在垃圾回收时关闭曾经是
允许的,但现在会抛出错误。
请确保所有 fs.FileHandle 对象在不再需要时使用
FileHandle.prototype.close() 显式关闭:
const fsPromises = require('node:fs').promises;
async function openAndClose() {
let filehandle;
try {
filehandle = await fsPromises.open('thefile.txt', 'r');
} finally {
if (filehandle !== undefined)
await filehandle.close();
}
}process.mainModule 是仅 CommonJS 的功能,而 process 全局
对象与非 CommonJS 环境共享。它在 ECMAScript
模块中的使用不受支持。
它已弃用,推荐使用 require.main,因为它服务于相同的
目的,且仅在 CommonJS 环境中可用。
自动迁移可用(来源):
npx codemod@latest @nodejs/process-main-module调用无参数的 process.umask() 会导致进程范围的 umask 被
写入两次。这在线程之间引入了竞态条件,并且是一个
潜在的安全漏洞。没有安全、跨平台的替代
API。
请改用 request.destroy() 而不是 request.abort()。
--pending-deprecation)node:repl 模块导出了输入和输出流两次。请改用 .input
而不是 .inputStream,改用 .output 而不是 .outputStream。
--pending-deprecation)node:repl 模块导出了一个包含内置模块数组的 _builtinLibs 属性。它目前不完整,最好依赖
require('node:module').builtinModules。
自动迁移可用(来源):
npx codemod@latest @nodejs/repl-builtin-modulesTransform._transformState 将在未来版本中移除,届时由于实现的简化,它将不再需要。
--pending-deprecation)CommonJS 模块可以使用 module.parent 访问第一个 require 它的模块。此功能已弃用,因为它在存在 ECMAScript 模块的情况下不能一致地工作,并且因为它给出了 CommonJS 模块图的不准确表示。
一些模块使用它来检查它们是否是当前进程的入口点。
相反,建议比较 require.main 和 module:
if (require.main === module) {
// 仅当当前文件是入口点时才会运行的代码部分。
}当查找 require 当前模块的 CommonJS 模块时,
可以使用 require.cache 和 module.children:
const moduleParents = Object.values(require.cache)
.filter((m) => m.children.includes(module));socket.bufferSize 只是 writable.writableLength 的别名。
crypto.Certificate() 构造函数 已弃用。请改用
crypto.Certificate() 的静态方法。
fs.rmdir、fs.rmdirSync 和 fs.promises.rmdir 方法曾经
支持 recursive 选项。该选项已被移除。
请改用 fs.rm(path, { recursive: true, force: true })、
fs.rmSync(path, { recursive: true, force: true }) 或
fs.promises.rm(path, { recursive: true, force: true })。
自动迁移可用(来源):
npx codemod@latest @nodejs/rmdir不再支持在 [子路径导出][] 或 [子路径导入][] 字段中使用尾部 "/" 来定义子路径文件夹映射。
请改用 [子路径模式][]。
首选 message.socket 而不是 message.connection。
process.config 属性提供对 Node.js 编译时设置的访问。
然而,该属性是可变的,因此易受篡改。更改值的能力
将在未来的 Node.js 版本中移除。
以前,index.js 和扩展名搜索查找会应用于
import 'pkg' 主入口点解析,即使在解析 ES 模块时也是如此。
通过此弃用,所有 ES 模块主入口点解析都需要
一个带有确切文件扩展名的显式 "exports" 或 "main" 入口。
'gc'、'http2' 和 'http' <PerformanceEntry> 对象类型曾经有
分配给它们的额外属性,提供额外信息。
这些属性现在可在 PerformanceEntry 对象的标准 detail 属性内使用。已弃用的访问器已被
移除。
在 dns.lookup() 和 dnsPromises.lookup() 中对 family 选项使用非空值非整数值,对 hints 选项使用非空值非数字值,对 all 选项使用非空值非布尔值,或对 verbatim 选项使用非空值非布尔值,将抛出
ERR_INVALID_ARG_TYPE 错误。
请使用 'hashAlgorithm' 而不是 'hash',使用 'mgf1HashAlgorithm' 而不是 'mgf1Hash'。
自动迁移可用(来源)。
npx codemod@latest @nodejs/crypto-rsa-pss-update对于包 "exports" 和 "imports" 模式解析,以 "/" 结尾的标识符(如 import 'pkg/x/')的重映射已弃用。
请改用 {Stream} API,因为 http.ClientRequest、
http.ServerResponse 和 http.IncomingMessage 都是基于流的。
检查 stream.destroyed 而不是 .aborted 属性,并监听
'close' 而不是 'abort'、'aborted' 事件。
.aborted 属性和 'abort' 事件仅对检测
.abort() 调用有用。对于提前关闭请求,使用 Stream
.destroy([error]),然后检查 .destroyed 属性和 'close' 事件
应具有相同的效果。接收端还应检查
http.IncomingMessage 上的 readable.readableEnded 值,以获取它是
被中止还是优雅销毁。
Node.js 流的一个未文档化功能是在 实现方法中支持 thenables。这现已弃用,请改用回调,并避免 在流实现方法中使用异步函数。
此功能导致用户遇到意外问题,即用户使用回调风格实现函数,但使用了例如异步方法,这将导致错误,因为混合 Promise 和回调语义是无效的。
const w = new Writable({
async final(callback) {
await someOp();
callback();
},
});此方法已被弃用,因为它与 Uint8Array.prototype.slice() 不兼容,而后者是 Buffer 的超类。
请改用 buffer.subarray,它执行相同的操作。
此错误代码已被移除,因为它给用于值类型验证的错误增加了更多的混淆。
此事件已被弃用并移除,因为它不适用于 V8 Promise 组合器,从而降低了其有用性。
process._getActiveHandles() 和 process._getActiveRequests() 函数并非 intended 供公开使用,并可能在未来的版本中被移除。
请使用 process.getActiveResourcesInfo() 来获取活动资源类型的列表,而不是实际的引用。
在 fs.write()、fs.writeFile()、fs.appendFile()、fs.writeFileSync() 和 fs.appendFileSync() 中作为第二个参数传递的具有自有 toString 属性的对象的隐式强制转换已被弃用。请将它们转换为原始字符串。
这些方法已被弃用,因为如果用户没有强引用它们,它们的使用可能会使 channel 对象容易被垃圾回收。弃用已被撤销,因为当 channel 有活动订阅者时,channel 对象现在可以抵抗垃圾回收。
除了 undefined、null、整数和整数字符串(例如 '1')之外的值,作为 process.exit() 中 code 参数的值以及分配给 process.exitCode 的值已被弃用。
--trace-atomics-wait 标志已被移除,因为它使用了 V8 钩子 SetAtomicsWaitCallback,该钩子将在未来的 V8 版本中被移除。
包导入和导出目标映射到包含双斜杠("/" 或 "\\")的路径已被弃用,并将在未来的版本中因解析验证错误而失败。此弃用同样适用于以斜杠开头或结尾的模式匹配。
众所周知的 MODP 组 modp1、modp2 和 modp5 已被弃用,因为它们无法抵御实际攻击。详见 RFC 8247 第 2.4 节。
这些组可能会在未来的 Node.js 版本中被移除。依赖这些组的应用程序应评估使用更强的 MODP 组。
Node-API 回调中未捕获异常的隐式抑制现已弃用。
设置标志 --force-node-api-uncaught-exceptions-policy 以强制 Node.js 在 Node-API 回调中未处理异常时发出 'uncaughtException' 事件。
node_modules code only)url.parse() 行为未标准化且容易出错,具有安全隐患。请改用 WHATWG URL API。不会为 url.parse() 漏洞发布 CVE。
调用 url.format(urlString) 或 url.resolve() 会在内部调用 url.parse(),因此也受此弃用的约束。
url.parse() 过去接受端口不是数字的 URL。此行为可能导致主机名欺骗和意外输入。这些 URL 将抛出错误(WHATWG URL API 也会这样做)。
在未来的 Node.js 版本中,message.headers、message.headersDistinct、message.trailers 和 message.trailersDistinct 将是只读的。
旧版本的 Node.js 会在函数绑定到 AsyncResource 时添加 asyncResource。现在不再这样做。
assert.CallTracker API 已被移除。
对返回 Promise 的函数调用 util.promisify 将忽略该 Promise 的结果,这可能导致未处理的 Promise 拒绝。
util.toUSVString() API 已弃用。请改用 String.prototype.toWellFormed。
直接暴露在 node:fs 上的 F_OK、R_OK、W_OK 和 X_OK 获取器已被移除。请改为从 fs.constants 或 fs.promises.constants 获取它们。
提供自动迁移工具 (源码):
npx codemod@latest @nodejs/fs-access-mode-constantsutil.types.isWebAssemblyCompiledModule API 已被移除。请改用 value instanceof WebAssembly.Module。
dirent.path 属性已被移除,因为其在发布版本之间缺乏一致性。请改用 dirent.parentPath。
提供自动迁移工具 (源码):
npx codemod@latest @nodejs/dirent-path-to-parent-path直接使用 Hash() 或 new Hash() 调用 Hash 类已被弃用,因为它是内部实现,不 intended 供公开使用。请使用 crypto.createHash() 方法来创建 Hash 实例。
直接使用 Stats() 或 new Stats() 调用 fs.Stats 类已被弃用,因为它是内部实现,不 intended 供公开使用。
直接使用 Hmac() 或 new Hmac() 调用 Hmac 类已被弃用,因为它是内部实现,不 intended 供公开使用。请使用 crypto.createHmac() 方法来创建 Hmac 实例。
对于 GCM 模式的密码,decipher.setAuthTag() 函数过去接受任何有效长度的认证标签(另见 DEP0090)。此例外已被移除,以便更好地符合 NIST SP 800-38D 的建议,打算使用短于默认认证标签长度(即短于 AES-GCM 的 16 字节)的认证标签的应用程序必须显式地将 crypto.createDecipheriv() 函数的 authTagLength 选项设置为适当的长度。
OpenSSL 3 已弃用对自定义引擎的支持,并建议切换到其新的提供者模型。https.request()、tls.createSecureContext() 和 tls.createServer() 的 clientCertEngine 选项;tls.createSecureContext() 的 privateKeyEngine 和 privateKeyIdentifier;以及 crypto.setEngine() 都依赖于 OpenSSL 的此功能。
实例化 node:zlib 模块导出的类时不使用 new 限定符已被弃用。建议改用 new 限定符。这适用于所有 Zlib 类,例如 Deflate、DeflateRaw、Gunzip、Inflate、InflateRaw、Unzip 和 Zlib。
实例化 node:repl 模块导出的类时不使用 new 限定符已被弃用。必须改用 new 限定符。这适用于所有 REPL 类,包括 REPLServer 和 Recoverable。
提供自动迁移工具 (源码):
npx codemod@latest @nodejs/repl-classes-with-new传递不支持的参数类型已被弃用,并且在未来的版本中将抛出错误,而不是返回 false。
这些属性无条件为 true。基于这些属性的任何检查都是多余的。
process.features.tls_alpn、process.features.tls_ocsp 和 process.features.tls_sni 已弃用,因为它们的值保证与 process.features.tls 的值相同。
当将 args 数组传递给 child_process.execFile 或 child_process.spawn 并带有选项 { shell: true } 或 { shell: '/path/to/shell' } 时,值不会被转义,仅以空格分隔,这可能导致 Shell 注入。
--pending-deprecation)node:repl 模块导出一个 builtinModules 属性,其中包含内置模块数组。这是不完整的,并且匹配已弃用的 repl._builtinLibs (DEP0142),最好依赖 require('node:module').builtinModules。
提供自动迁移工具 (源码):
npx codemod@latest @nodejs/repl-builtin-modulesnode:_tls_common 和 node:_tls_wrap 模块已弃用,因为它们应被视为内部 nodejs 实现而不是公开 API,请改用 node:tls。
node:_stream_duplex、node:_stream_passthrough、node:_stream_readable、node:_stream_transform、node:_stream_wrap 和 node:_stream_writable 模块已弃用,因为它们应被视为内部 nodejs 实现而不是公开 API,请改用 node:stream。
对在 RFC 9113 中弃用的优先级信令的支持已被移除。
实例化 node:http 模块导出的类时不使用 new 限定符已被弃用。建议改用 new 限定符。这适用于所有 http 类,例如 OutgoingMessage、IncomingMessage、ServerResponse 和 ClientRequest。
提供自动迁移工具 (源码):
npx codemod@latest @nodejs/http-classes-with-new使用 { shell: '' } 调用进程生成函数几乎肯定是有意的,并且可能导致异常行为。
要使 child_process.execFile 或 child_process.spawn 调用默认 shell,请使用 { shell: true }。如果意图是不调用 shell(默认行为),要么省略 shell 选项,要么将其设置为 false 或 nullish 值。
要使 child_process.exec 调用默认 shell,要么省略 shell 选项,要么将其设置为 nullish 值。如果意图是不调用 shell,请改用 child_process.execFile。
util.types.isNativeError API 已弃用。请改用 Error.isError。
提供自动迁移工具 (源码):
npx codemod@latest @nodejs/types-is-native-error创建 SHAKE-128 和 SHAKE-256 摘要时没有显式 options.outputLength 已被弃用。
node:_http_agent、node:_http_client、node:_http_common、node:_http_incoming、node:_http_outgoing 和 node:_http_server 模块已弃用,因为它们应被视为内部 nodejs 实现而不是公开 API,请改用 node:http。
允许 fs.Dir 对象在垃圾回收时关闭已被弃用。在未来,这样做可能会导致抛出错误并终止进程。
请确保所有 fs.Dir 对象都使用 Dir.prototype.close() 或 using 关键字显式关闭:
import { opendir } from 'node:fs/promises';
{
await using dir = await opendir('/async/disposable/directory');
} // 由 dir[Symbol.asyncDispose]() 关闭
{
using dir = await opendir('/sync/disposable/directory');
} // 由 dir[Symbol.dispose]() 关闭
{
const dir = await opendir('/unconditionally/iterated/directory');
for await (const entry of dir) {
// 处理条目
} // 由迭代器关闭
}
{
let dir;
try {
dir = await opendir('/legacy/closeable/directory');
} finally {
await dir?.close();
}
}传递 type 选项给 Duplex.toWeb() 已被弃用。要指定构造的可读 - 可写对的可读部分的类型,请改用 readableType 选项。
http2.createServer() 和 http2.createSecureServer() 的 Http1IncomingMessage 和 Http1ServerResponse 选项已弃用。请改用 http1Options.IncomingMessage 和 http1Options.ServerResponse。
// 已弃用
const server = http2.createSecureServer({
allowHTTP1: true,
Http1IncomingMessage: MyIncomingMessage,
Http1ServerResponse: MyServerResponse,
});传递 CryptoKey 给 node:crypto 函数已被弃用,并将在未来的版本中抛出错误。这包括 crypto.createPublicKey()、crypto.createPrivateKey()、crypto.sign()、crypto.verify()、crypto.publicEncrypt()、crypto.publicDecrypt()、crypto.privateEncrypt()、crypto.privateDecrypt()、Sign.prototype.sign()、Verify.prototype.verify()、crypto.createHmac()、crypto.createCipheriv()、crypto.createDecipheriv()、crypto.encapsulate() 和 crypto.decapsulate()。
传递不可提取的 CryptoKey 给 KeyObject.from() 已被弃用,并将在未来的版本中抛出错误。
module.register() 已弃用。请改用 module.registerHooks()。
module.register() API 提供离线异步钩子用于自定义 ES 模块;module.registerHooks() API 提供类似的同步、线程内钩子,并适用于所有类型的模块。
支持异步钩子已被证明是复杂的,涉及 worker 线程协调,并且存在无法解决的问题。详见 异步自定义钩子的注意事项。请尽快迁移到 module.registerHooks(),因为 module.register() 将在未来的 Node.js 版本中被移除。
多次调用 hmac.digest() 会返回一个空缓冲区,而不是抛出错误。此行为与 hash.digest() 不一致,并可能导致隐蔽的错误。在已完成最终化的 Hmac 实例上调用 hmac.digest() 将在未来版本中抛出错误。