已弃用的 API#

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 的弃用可能会被撤销。在这种情况下,本文档将更新与该决定相关的信息。但是,弃用标识符不会被修改。

已弃用的 API 列表#

DEP0001: http.OutgoingMessage.prototype.flush#

类型:生命周期结束

OutgoingMessage.prototype.flush() 已被移除。请改用 OutgoingMessage.prototype.flushHeaders()

DEP0002: require('_linklist')#

类型:生命周期结束

_linklist 模块已弃用。请使用用户区(userland)的替代方案。

DEP0003: _writableState.buffer#

类型:生命周期结束

_writableState.buffer 已被移除。请改用 _writableState.getBuffer()

DEP0004: CryptoStream.prototype.readyState#

类型:生命周期结束

CryptoStream.prototype.readyState 属性已被移除。

DEP0005: Buffer() 构造函数#

类型:应用程序(仅限非 node_modules 代码)

由于 API 的可用性问题可能导致意外的安全问题,Buffer() 函数和 new Buffer() 构造函数已被弃用。

作为替代方案,请使用以下方法之一构造 Buffer 对象

在没有 --pending-deprecation 的情况下,运行时警告仅针对不在 node_modules 中的代码发生。这意味着在依赖项中使用 Buffer() 不会产生弃用警告。使用 --pending-deprecation 时,无论 Buffer() 的使用位置在哪里,都会产生运行时警告。

DEP0006: child_process options.customFds#

类型:生命周期结束

child_process 模块的 spawn()fork()exec() 方法中,options.customFds 选项已弃用。应改用 options.stdio 选项。

DEP0007: 使用 worker.exitedAfterDisconnect 替换 cluster worker.suicide#

类型:生命周期结束

在早期版本的 Node.js cluster 中,一个名为 suicide 的布尔属性被添加到 Worker 对象中。此属性的意图是提供一个关于 Worker 实例如何以及为何退出的指示。在 Node.js 6.0.0 中,旧属性被弃用,并被新的 worker.exitedAfterDisconnect 属性替换。旧属性名称没有精确描述实际语义,而且带有不必要的情感色彩。

DEP0008: require('node:constants')#

类型:仅文档

node:constants 模块已弃用。当需要访问与特定 Node.js 内置模块相关的常量时,开发者应转而引用相关模块公开的 constants 属性。例如,require('node:fs').constantsrequire('node:os').constants

DEP0009: 不带摘要的 crypto.pbkdf2#

类型:生命周期结束

在 Node.js 6.0 中,由于该方法默认使用不推荐的 'SHA1' 摘要,因此不指定摘要的 crypto.pbkdf2() API 的使用已被弃用。以前,会打印一个弃用警告。从 Node.js 8.0.0 开始,使用 digest 设置为 undefined 调用 crypto.pbkdf2()crypto.pbkdf2Sync() 将会抛出 TypeError

从 Node.js v11.0.0 开始,使用 digest 设置为 null 调用这些函数会打印一个弃用警告,以与 digestundefined 时的行为保持一致。

然而,现在传递 undefinednull 都会抛出 TypeError

DEP0010: crypto.createCredentials#

类型:生命周期结束

crypto.createCredentials() API 已被移除。请改用 tls.createSecureContext()

DEP0011: crypto.Credentials#

类型:生命周期结束

crypto.Credentials 类已被移除。请改用 tls.SecureContext

DEP0012: Domain.dispose#

类型:生命周期结束

Domain.dispose() 已被移除。请通过在域上设置的错误事件处理程序来明确地从失败的 I/O 操作中恢复。

DEP0013: 不带回调的 fs 异步函数#

类型:生命周期结束

从 Node.js 10.0.0 开始,调用不带回调的异步函数会抛出 TypeError。请参阅 https://github.com/nodejs/node/pull/12562

DEP0014: fs.read 旧式字符串接口#

类型:生命周期结束

fs.read() 的旧式 String 接口已弃用。请改用文档中提到的 Buffer API。

DEP0015: fs.readSync 旧式字符串接口#

类型:生命周期结束

fs.readSync() 的旧式 String 接口已弃用。请改用文档中提到的 Buffer API。

DEP0016: GLOBAL/root#

类型:生命周期结束

global 属性的别名 GLOBALroot 在 Node.js 6.0.0 中被弃用,并已被移除。

DEP0017: Intl.v8BreakIterator#

类型:生命周期结束

Intl.v8BreakIterator 是一个非标准扩展,已被移除。请参阅 Intl.Segmenter

DEP0018: 未处理的 promise 拒绝#

类型:生命周期结束

未处理的 promise 拒绝已被弃用。默认情况下,未被处理的 promise 拒绝会以非零退出码终止 Node.js 进程。要更改 Node.js 处理未处理拒绝的方式,请使用 --unhandled-rejections 命令行选项。

DEP0019: 在目录外解析的 require('.')#

类型:生命周期结束

在某些情况下,require('.') 可能会解析到包目录之外。此行为已被移除。

DEP0020: Server.connections#

类型:生命周期结束

Server.connections 属性在 Node.js v0.9.7 中被弃用,并已被移除。请改用 Server.getConnections() 方法。

DEP0021: Server.listenFD#

类型:生命周期结束

Server.listenFD() 方法已被弃用和移除。请改用 Server.listen({fd: <number>})

DEP0022: os.tmpDir()#

类型:生命周期结束

os.tmpDir() API 在 Node.js 7.0.0 中被弃用,并已被移除。请改用 os.tmpdir()

有一个可用的自动迁移工具(源代码

npx codemod@latest @nodejs/tmpDir-to-tmpdir 

DEP0023: os.getNetworkInterfaces()#

类型:生命周期结束

os.getNetworkInterfaces() 方法已弃用。请改用 os.networkInterfaces() 方法。

DEP0024: REPLServer.prototype.convertToContext()#

类型:生命周期结束

REPLServer.prototype.convertToContext() API 已被移除。

DEP0025: require('node:sys')#

类型:运行时

node:sys 模块已弃用。请改用 util 模块。

DEP0026: util.print()#

类型:生命周期结束

util.print() 已被移除。请改用 console.log()

有一个可用的自动迁移工具(源代码

npx codemod@latest @nodejs/util-print-to-console-log 

DEP0027: util.puts()#

类型:生命周期结束

util.puts() 已被移除。请改用 console.log()

有一个可用的自动迁移工具(源代码

npx codemod@latest @nodejs/util-print-to-console-log 

DEP0028: util.debug()#

类型:生命周期结束

util.debug() 已被移除。请改用 console.error()

有一个可用的自动迁移工具(源代码

npx codemod@latest @nodejs/util-debug-to-console-error 

DEP0029: util.error()#

类型:生命周期结束

util.error() 已被移除。请改用 console.error()

有一个可用的自动迁移工具(源代码

npx codemod@latest @nodejs/util-print-to-console-log 

DEP0030: SlowBuffer#

类型:生命周期结束

SlowBuffer 类已被移除。请改用 Buffer.allocUnsafeSlow(size)

DEP0031: ecdh.setPublicKey()#

类型:运行时

ecdh.setPublicKey() 方法现已弃用,因为它在 API 中的包含没有用处。

DEP0032: node:domain 模块#

类型:仅文档

domain 模块已弃用,不应使用。

DEP0033: EventEmitter.listenerCount()#

类型:仅文档

events.listenerCount(emitter, eventName) API 已弃用。请改用 emitter.listenerCount(eventName)

DEP0034: fs.exists(path, callback)#

类型:仅文档

fs.exists(path, callback) API 已弃用。请改用 fs.stat()fs.access()

DEP0035: fs.lchmod(path, mode, callback)#

类型:仅文档

fs.lchmod(path, mode, callback) API 已弃用。

DEP0036: fs.lchmodSync(path, mode)#

类型:仅文档

fs.lchmodSync(path, mode) API 已弃用。

DEP0037: fs.lchown(path, uid, gid, callback)#

类型:弃用已撤销

fs.lchown(path, uid, gid, callback) API 已被弃用。由于 libuv 中添加了必要的支持 API,该弃用已被撤销。

DEP0038: fs.lchownSync(path, uid, gid)#

类型:弃用已撤销

fs.lchownSync(path, uid, gid) API 已被弃用。由于 libuv 中添加了必要的支持 API,该弃用已被撤销。

DEP0039: require.extensions#

类型:仅文档

require.extensions 属性已弃用。

DEP0040: node:punycode 模块#

类型:运行时

punycode 模块已弃用。请改用用户区的替代方案。

DEP0041: NODE_REPL_HISTORY_FILE 环境变量#

类型:生命周期结束

NODE_REPL_HISTORY_FILE 环境变量已被移除。请改用 NODE_REPL_HISTORY

DEP0042: tls.CryptoStream#

类型:生命周期结束

tls.CryptoStream 类已被移除。请改用 tls.TLSSocket

DEP0043: tls.SecurePair#

类型:生命周期结束

tls.SecurePair 类已弃用。请改用 tls.TLSSocket

DEP0044: util.isArray()#

类型:运行时

util.isArray() API 已弃用。请改用 Array.isArray()

DEP0045: util.isBoolean()#

类型:生命周期结束

util.isBoolean() API 已被移除。请改用 typeof arg === 'boolean'

DEP0046: util.isBuffer()#

类型:生命周期结束

util.isBuffer() API 已被移除。请改用 Buffer.isBuffer()

DEP0047: util.isDate()#

类型:生命周期结束

util.isDate() API 已被移除。请改用 arg instanceof Date

此外,为了更可靠的方法,可以考虑使用:Date.prototype.toString.call(arg) === '[object Date]' && !isNaN(arg)。这也可以在 try/catch 块中使用来处理无效的日期对象。

DEP0048: util.isError()#

类型:生命周期结束

util.isError() API 已被移除。请使用 Error.isError(arg)

DEP0049: util.isFunction()#

类型:生命周期结束

util.isFunction() API 已被移除。请改用 typeof arg === 'function'

DEP0050: util.isNull()#

类型:生命周期结束

util.isNull() API 已被移除。请改用 arg === null

DEP0051: util.isNullOrUndefined()#

类型:生命周期结束

util.isNullOrUndefined() API 已被移除。请改用 arg === null || arg === undefined

DEP0052: util.isNumber()#

类型:生命周期结束

util.isNumber() API 已被移除。请改用 typeof arg === 'number'

DEP0053: util.isObject()#

类型:生命周期结束

util.isObject() API 已被移除。请改用 arg && typeof arg === 'object'

DEP0054: util.isPrimitive()#

类型:生命周期结束

util.isPrimitive() API 已被移除。请改用 Object(arg) !== arg

DEP0055: util.isRegExp()#

类型:生命周期结束

util.isRegExp() API 已被移除。请改用 arg instanceof RegExp

DEP0056: util.isString()#

类型:生命周期结束

util.isString() API 已被移除。请改用 typeof arg === 'string'

DEP0057: util.isSymbol()#

类型:生命周期结束

util.isSymbol() API 已被移除。请改用 typeof arg === 'symbol'

DEP0058: util.isUndefined()#

类型:生命周期结束

util.isUndefined() API 已被移除。请改用 arg === undefined

DEP0059: util.log()#

类型:生命周期结束

util.log() API 已被移除,因为它是一个未维护的旧版 API,意外地暴露给了用户区。相反,请根据您的具体需求考虑以下替代方案:

  • 第三方日志库

  • 使用 console.log(new Date().toLocaleString(), message)

通过采用这些替代方案之一,您可以从 util.log() 过渡,并选择一种符合您应用程序特定要求和复杂性的日志记录策略。

有一个可用的自动迁移工具(源代码

npx codemod@latest @nodejs/util-log-to-console-log 

DEP0060: util._extend()#

类型:运行时

util._extend() API 已弃用,因为它是一个未维护的旧版 API,意外地暴露给了用户区。请改用 target = Object.assign(target, source)

DEP0061: fs.SyncWriteStream#

类型:生命周期结束

fs.SyncWriteStream 类从未打算成为一个公共可访问的 API,并已被移除。没有可用的替代 API。请使用用户区的替代方案。

DEP0062: node --debug#

类型:生命周期结束

--debug 激活旧版 V8 调试器接口,该接口已从 V8 5.8 开始移除。它被 Inspector 取代,Inspector 使用 --inspect 来激活。

DEP0063: ServerResponse.prototype.writeHeader()#

类型:运行时

node:http 模块的 ServerResponse.prototype.writeHeader() API 已弃用。请改用 ServerResponse.prototype.writeHead()

ServerResponse.prototype.writeHeader() 方法从未被记录为官方支持的 API。

DEP0064: tls.createSecurePair()#

类型:生命周期结束

tls.createSecurePair() API 在 Node.js 0.11.3 的文档中被弃用。用户应改用 tls.Socket

DEP0065: repl.REPL_MODE_MAGICNODE_REPL_MODE=magic#

类型:生命周期结束

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

DEP0066: OutgoingMessage.prototype._headers, OutgoingMessage.prototype._headerNames#

类型:生命周期结束

node:http 模块的 OutgoingMessage.prototype._headersOutgoingMessage.prototype._headerNames 属性已弃用。请使用公共方法之一(例如 OutgoingMessage.prototype.getHeader()OutgoingMessage.prototype.getHeaders()OutgoingMessage.prototype.getHeaderNames()OutgoingMessage.prototype.getRawHeaderNames()OutgoingMessage.prototype.hasHeader()OutgoingMessage.prototype.removeHeader()OutgoingMessage.prototype.setHeader())来处理传出标头。

OutgoingMessage.prototype._headersOutgoingMessage.prototype._headerNames 属性从未被记录为官方支持的属性。

DEP0067: OutgoingMessage.prototype._renderHeaders#

类型:仅文档

node:http 模块的 OutgoingMessage.prototype._renderHeaders() API 已弃用。

OutgoingMessage.prototype._renderHeaders 属性从未被记录为官方支持的 API。

DEP0068: node debug#

类型:生命周期结束

node debug 对应于旧版 CLI 调试器,该调试器已被基于 V8-inspector 的 CLI 调试器取代,可通过 node inspect 使用。

DEP0069: vm.runInDebugContext(string)#

类型:生命周期结束

DebugContext 已在 V8 中移除,在 Node.js 10+ 中不可用。

DebugContext 是一个实验性 API。

DEP0070: async_hooks.currentId()#

类型:生命周期结束

为了清晰起见,async_hooks.currentId() 已重命名为 async_hooks.executionAsyncId()

此更改是在 async_hooks 还是实验性 API 时进行的。

DEP0071: async_hooks.triggerId()#

类型:生命周期结束

为了清晰起见,async_hooks.triggerId() 已重命名为 async_hooks.triggerAsyncId()

此更改是在 async_hooks 还是实验性 API 时进行的。

DEP0072: async_hooks.AsyncResource.triggerId()#

类型:生命周期结束

为了清晰起见,async_hooks.AsyncResource.triggerId() 已重命名为 async_hooks.AsyncResource.triggerAsyncId()

此更改是在 async_hooks 还是实验性 API 时进行的。

DEP0073: net.Server 的几个内部属性#

类型:生命周期结束

访问 net.Server 实例的几个名称不当的内部、未文档化属性已被弃用。

由于原始 API 未文档化且对非内部代码通常无用,因此不提供替代 API。

DEP0074: REPLServer.bufferedCommand#

类型:生命周期结束

REPLServer.bufferedCommand 属性已弃用,推荐使用 REPLServer.clearBufferedCommand()

DEP0075: REPLServer.parseREPLKeyword()#

类型:生命周期结束

REPLServer.parseREPLKeyword() 已从用户区可见性中移除。

DEP0076: tls.parseCertString()#

类型:生命周期结束

tls.parseCertString() 是一个简单的解析辅助函数,因失误而被公开。虽然它本应解析证书主题和颁发者字符串,但它从未正确处理多值的相对辨别名称 (Relative Distinguished Names)。

本文档的早期版本建议使用 querystring.parse() 作为 tls.parseCertString() 的替代方案。然而,querystring.parse() 也不能正确处理所有证书主题,不应使用。

DEP0077: Module._debug()#

类型:生命周期结束

Module._debug() 已被移除。

Module._debug() 函数从未被记录为官方支持的 API。

DEP0078: REPLServer.turnOffEditorMode()#

类型:生命周期结束

REPLServer.turnOffEditorMode() 已从用户区可见性中移除。

DEP0079: 通过 .inspect() 在对象上自定义检查函数#

类型:生命周期结束

在对象上使用名为 inspect 的属性为 util.inspect() 指定自定义检查函数已弃用。请改用 util.inspect.custom。为了与 6.4.0 版本之前的 Node.js 向后兼容,可以同时指定两者。

DEP0080: path._makeLong()#

类型:仅文档

内部的 path._makeLong() 并非为公共使用而设计。然而,用户区模块发现它很有用。内部 API 已弃用,并被一个相同的、公共的 path.toNamespacedPath() 方法取代。

DEP0081: 使用文件描述符的 fs.truncate()#

类型:生命周期结束

使用文件描述符的 fs.truncate()fs.truncateSync() 已弃用。请使用 fs.ftruncate()fs.ftruncateSync() 来处理文件描述符。

DEP0082: REPLServer.prototype.memory()#

类型:生命周期结束

REPLServer.prototype.memory() 仅对 REPLServer 本身的内部机制是必需的。不要使用此函数。

DEP0083: 通过将 ecdhCurve 设置为 false 来禁用 ECDH#

类型:生命周期结束

tls.createSecureContext()tls.TLSSocketecdhCurve 选项可以设置为 false 以仅在服务器上完全禁用 ECDH。此模式已弃用,以便为迁移到 OpenSSL 1.1.0 以及与客户端保持一致做准备,现在已不受支持。请改用 ciphers 参数。

DEP0084: 引用捆绑的内部依赖项#

类型:生命周期结束

自 Node.js 版本 4.4.0 和 5.2.0 以来,一些仅供内部使用的模块被错误地通过 require() 暴露给了用户代码。这些模块是:

  • v8/tools/codemap
  • v8/tools/consarray
  • v8/tools/csvparser
  • v8/tools/logreader
  • v8/tools/profile_view
  • v8/tools/profile
  • v8/tools/SourceMap
  • v8/tools/splaytree
  • v8/tools/tickprocessor-driver
  • v8/tools/tickprocessor
  • node-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 注册表上。如果这样做,则无需修改源代码。

DEP0085: AsyncHooks 敏感 API#

类型:生命周期结束

AsyncHooks 敏感 API 从未被文档化,并且存在各种小问题。请改用 AsyncResource API。请参阅 https://github.com/nodejs/node/issues/15572

DEP0086: 移除 runInAsyncIdScope#

类型:生命周期结束

runInAsyncIdScope 不会触发 'before''after' 事件,因此可能导致很多问题。请参阅 https://github.com/nodejs/node/issues/14328

DEP0089: require('node:assert')#

类型:弃用已撤销

不推荐直接导入 assert,因为暴露的函数使用松散相等性检查。该弃用已被撤销,因为不鼓励使用 node:assert 模块,并且该弃用导致了开发者的困惑。

DEP0090: 无效的 GCM 身份验证标签长度#

类型:生命周期结束

Node.js 过去在调用 decipher.setAuthTag() 时支持 OpenSSL 接受的所有 GCM 身份验证标签长度。从 Node.js v11.0.0 开始,只允许 128、120、112、104、96、64 和 32 位的身份验证标签长度。根据 NIST SP 800-38D,其他长度的身份验证标签是无效的。

DEP0091: crypto.DEFAULT_ENCODING#

类型:生命周期结束

crypto.DEFAULT_ENCODING 属性仅为与 0.9.3 版本之前的 Node.js 版本兼容而存在,现已被移除。

DEP0092: 绑定到 module.exports 的顶级 this#

类型:仅文档

将属性分配给顶级 this 作为 module.exports 的替代方法已弃用。开发者应改用 exportsmodule.exports

DEP0093: crypto.fips 已弃用并被替换#

类型:运行时

crypto.fips 属性已弃用。请改用 crypto.setFips()crypto.getFips()

DEP0094: 使用带有一个以上参数的 assert.fail()#

类型:生命周期结束

使用带有一个以上参数的 assert.fail() 已弃用。请使用只有一个参数的 assert.fail() 或使用不同的 node:assert 模块方法。

DEP0095: timers.enroll()#

类型:生命周期结束

timers.enroll() 已被移除。请改用公开文档化的 setTimeout()setInterval()

DEP0096: timers.unenroll()#

类型:生命周期结束

timers.unenroll() 已被移除。请改用公开文档化的 clearTimeout()clearInterval()

DEP0097: 带有 domain 属性的 MakeCallback#

类型:运行时

使用 MakeCallback 并添加 domain 属性来传递上下文的用户,应开始使用 MakeCallbackCallbackScopeasync_context 变体,或者使用高级的 AsyncResource 类。

DEP0098: AsyncHooks 嵌入器 AsyncResource.emitBeforeAsyncResource.emitAfter API#

类型:生命周期结束

AsyncHooks 提供的嵌入式 API 公开了 .emitBefore().emitAfter() 方法,这些方法很容易被错误使用,从而导致不可恢复的错误。

请改用 asyncResource.runInAsyncScope() API,它提供了一个更安全、更方便的替代方案。请参阅 https://github.com/nodejs/node/pull/18513

DEP0099: 异步上下文无关的 node::MakeCallback C++ API#

类型:编译时

提供给原生插件的某些版本的 node::MakeCallback API 已弃用。请使用接受 async_context 参数的 API 版本。

DEP0100: process.assert()#

类型:生命周期结束

process.assert() 已弃用。请改用 assert 模块。

这从未是一个被文档化的功能。

DEP0101: --with-lttng#

类型:生命周期结束

--with-lttng 编译时选项已被移除。

DEP0102: 在 Buffer#(read|write) 操作中使用 noAssert#

类型:生命周期结束

使用 noAssert 参数已不再具有任何功能。所有输入都会被验证,无论 noAssert 的值如何。跳过验证可能导致难以发现的错误和崩溃。

DEP0103: process.binding('util').is[...] 类型检查#

类型:仅文档(支持 --pending-deprecation

通常应避免使用 process.binding()。特别是类型检查方法可以通过使用 util.types 来替换。

此弃用已被 process.binding() API 的弃用(DEP0111)所取代。

DEP0104: process.env 字符串强制转换#

类型:仅文档(支持 --pending-deprecation

当将非字符串属性分配给 process.env 时,分配的值会被隐式转换为字符串。如果分配的值不是字符串、布尔值或数字,则此行为已弃用。将来,此类分配可能会导致抛出错误。请在将属性分配给 process.env 之前将其转换为字符串。

DEP0105: decipher.finaltol#

类型:生命周期结束

decipher.finaltol() 从未被文档化,并且是 decipher.final() 的别名。此 API 已被移除,建议改用 decipher.final()

DEP0106: crypto.createCiphercrypto.createDecipher#

类型:生命周期结束

crypto.createCipher()crypto.createDecipher() 已被移除,因为它们使用弱密钥派生函数(无盐的 MD5)和静态初始化向量。建议使用带有随机盐的 crypto.pbkdf2()crypto.scrypt() 来派生密钥,并使用 crypto.createCipheriv()crypto.createDecipheriv() 来分别获取 CipherivDecipheriv 对象。

DEP0107: tls.convertNPNProtocols()#

类型:生命周期结束

这是一个未文档化的辅助函数,不应在 Node.js 核心之外使用,并且由于 NPN(下一协议协商)支持的移除而过时。

DEP0108: zlib.bytesRead#

类型:生命周期结束

zlib.bytesWritten 的已弃用别名。选择此原始名称是因为将该值解释为引擎读取的字节数也说得通,但与 Node.js 中以这些名称公开值的其他流不一致。

DEP0109: httphttpstls 对无效 URL 的支持#

类型:生命周期结束

一些以前支持(但严格来说是无效的)的 URL 被 http.request()http.get()https.request()https.get()tls.checkServerIdentity() API 接受,因为它们被旧版的 url.parse() API 接受。上述 API 现在使用 WHATWG URL 解析器,该解析器要求严格有效的 URL。传递无效 URL 已弃用,并且支持将在未来移除。

DEP0110: vm.Script 缓存数据#

类型:仅文档

produceCachedData 选项已弃用。请改用 script.createCachedData()

DEP0111: process.binding()#

类型:仅文档(支持 --pending-deprecation

process.binding() 仅供 Node.js 内部代码使用。

虽然 process.binding() 通常尚未达到生命周期结束状态,但在启用权限模型时不可用。

DEP0112: dgram 私有 API#

类型:生命周期结束

node:dgram 模块以前包含一些从未打算在 Node.js 核心之外访问的 API:Socket.prototype._handleSocket.prototype._receivingSocket.prototype._bindStateSocket.prototype._queueSocket.prototype._reuseAddrSocket.prototype._healthCheck()Socket.prototype._stopReceiving()dgram._createSocketHandle()。这些已被移除。

DEP0113: Cipher.setAuthTag(), Decipher.getAuthTag()#

类型:生命周期结束

Cipher.setAuthTag()Decipher.getAuthTag() 不再可用。它们从未被文档化,并且在调用时会抛出异常。

DEP0114: crypto._toBuf()#

类型:生命周期结束

crypto._toBuf() 函数并非为 Node.js 核心之外的模块使用而设计,现已被移除。

DEP0115: crypto.prng(), crypto.pseudoRandomBytes(), crypto.rng()#

类型:仅文档(支持 --pending-deprecation

在最新版本的 Node.js 中,crypto.randomBytes()crypto.pseudoRandomBytes() 之间没有区别。后者连同未文档化的别名 crypto.prng()crypto.rng() 已被弃用,推荐使用 crypto.randomBytes(),并可能在未来版本中移除。

DEP0116: 旧版 URL API#

类型:弃用已撤销

旧版 URL API 已弃用。这包括 url.format()url.parse()url.resolve()旧版 urlObject。请改用 WHATWG URL API

DEP0117: 原生加密句柄#

类型:生命周期结束

以前版本的 Node.js 通过 CipherDecipherDiffieHellmanDiffieHellmanGroupECDHHashHmacSignVerify 类的 _handle 属性暴露了内部原生对象的句柄。_handle 属性已被移除,因为不当使用原生对象可能导致应用程序崩溃。

DEP0118: dns.lookup() 对假值主机名的支持#

类型:生命周期结束

由于向后兼容性,以前版本的 Node.js 支持使用假值主机名的 dns.lookup(),如 dns.lookup(false)。此功能已被移除。

DEP0119: process.binding('uv').errname() 私有 API#

类型:仅文档(支持 --pending-deprecation

process.binding('uv').errname() 已弃用。请改用 util.getSystemErrorName()

DEP0120: Windows 性能计数器支持#

类型:生命周期结束

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() 函数已被弃用。

DEP0121: net._setSimultaneousAccepts()#

类型:生命周期结束

未文档化的 net._setSimultaneousAccepts() 函数最初用于在 Windows 上使用 node:child_processnode:cluster 模块时进行调试和性能调优。该函数通常无用,正在被移除。请参阅此处的讨论:https://github.com/nodejs/node/issues/18391

DEP0122: tls Server.prototype.setOptions()#

类型:生命周期结束

请改用 Server.prototype.setSecureContext()

DEP0123: 将 TLS ServerName 设置为 IP 地址#

类型:生命周期结束

RFC 6066 不允许将 TLS ServerName 设置为 IP 地址。

DEP0124: 使用 REPLServer.rli#

类型:生命周期结束

此属性是对实例本身的引用。

DEP0125: require('node:_stream_wrap')#

类型:运行时

node:_stream_wrap 模块已弃用。

DEP0126: timers.active()#

类型:生命周期结束

先前未文档化的 timers.active() 已被移除。请改用公开文档化的 timeout.refresh()。如果需要重新引用超时,可以使用 timeout.ref(),自 Node.js 10 以来没有性能影响。

DEP0127: timers._unrefActive()#

类型:生命周期结束

先前未文档化且为“私有”的 timers._unrefActive() 已被移除。请改用公开文档化的 timeout.refresh()。如果需要取消引用超时,可以使用 timeout.unref(),自 Node.js 10 以来没有性能影响。

DEP0128: 具有无效 main 入口和 index.js 文件的模块#

类型:运行时

具有无效 main 入口(例如 ./does-not-exist.js)并且在顶级目录中也有 index.js 文件的模块将解析 index.js 文件。这种行为已被弃用,并将在未来的 Node.js 版本中抛出错误。

DEP0129: ChildProcess._channel#

类型:生命周期结束

spawn() 及类似函数返回的子进程对象的 _channel 属性并非为公共使用而设计。请改用 ChildProcess.channel

DEP0130: Module.createRequireFromPath()#

类型:生命周期结束

请改用 module.createRequire()

有一个可用的自动迁移工具(源代码

npx codemod@latest @nodejs/create-require-from-path 

DEP0131: 旧版 HTTP 解析器#

类型:生命周期结束

旧版 HTTP 解析器(在 12.0.0 之前的 Node.js 版本中默认使用)已弃用,并已在 v13.0.0 中移除。在 v13.0.0 之前,可以使用 --http-parser=legacy 命令行标志来恢复使用旧版解析器。

DEP0132: 带回调的 worker.terminate()#

类型:生命周期结束

worker.terminate() 传递回调已弃用。请改用返回的 Promise,或使用工作进程的 'exit' 事件监听器。

DEP0133: http connection#

类型:仅文档

优先使用 response.socket 而不是 response.connection,以及 request.socket 而不是 request.connection

DEP0134: process._tickCallback#

类型:仅文档(支持 --pending-deprecation

process._tickCallback 属性从未被记录为官方支持的 API。

DEP0135: WriteStream.open()ReadStream.open() 是内部函数#

类型:生命周期结束

WriteStream.open()ReadStream.open() 是未写入文档的内部 API,在用户区(userland)代码中使用它们没有意义。文件流应始终通过其对应的工厂方法 fs.createWriteStream()fs.createReadStream() 来打开,或者通过在选项中传递文件描述符来打开。

DEP0136: http finished#

类型:仅文档

response.finished 指示 response.end() 是否已被调用,而不是 'finish' 事件是否已触发以及底层数据是否已刷新。

应相应地使用 response.writableFinishedresponse.writableEnded 来避免歧义。

为了保持现有行为,response.finished 应替换为 response.writableEnded

DEP0137: 在垃圾回收时关闭 fs.FileHandle#

类型:生命周期结束

过去允许 fs.FileHandle 对象在垃圾回收时被关闭,但现在这样做会抛出错误。

请确保在不再需要 fs.FileHandle 对象时,使用 FileHandle.prototype.close() 显式关闭所有 fs.FileHandle 对象。

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();
  }
} 

DEP0138: process.mainModule#

类型:仅文档

process.mainModule 是一个仅适用于 CommonJS 的特性,而 process 全局对象与非 CommonJS 环境共享。不支持在 ECMAScript 模块中使用它。

它已被弃用,推荐使用 require.main,因为后者功能相同,并且仅在 CommonJS 环境中可用。

提供了一个自动迁移工具(源码)。

npx codemod@latest @nodejs/process-main-module 

DEP0139: 不带参数的 process.umask()#

类型:仅文档

不带参数调用 process.umask() 会导致进程范围的 umask 被写入两次。这会在线程之间引入竞争条件,是一个潜在的安全漏洞。目前没有安全的、跨平台的替代 API。

DEP0140: 使用 request.destroy() 替代 request.abort()#

类型:仅文档

请使用 request.destroy() 替代 request.abort()

DEP0141: repl.inputStreamrepl.outputStream#

类型:仅文档(支持 --pending-deprecation

node:repl 模块导出了两次输入和输出流。请使用 .input 替代 .inputStream,使用 .output 替代 .outputStream

DEP0142: repl._builtinLibs#

类型:仅文档(支持 --pending-deprecation

node:repl 模块导出了一个 _builtinLibs 属性,它包含一个内置模块的数组。这个列表至今仍不完整,更好的方法是依赖 require('node:module').builtinModules

DEP0143: Transform._transformState#

类型:生命周期结束

由于实现简化,Transform._transformState 在未来的版本中将不再需要,届时将被移除。

DEP0144: module.parent#

类型:仅文档(支持 --pending-deprecation

一个 CommonJS 模块可以使用 module.parent 访问第一个引用它的模块。此特性已被弃用,因为它在存在 ECMAScript 模块的情况下不能一致地工作,并且它给出了不准确的 CommonJS 模块图表示。

一些模块用它来检查自己是否是当前进程的入口点。相反,建议比较 require.mainmodule

if (require.main === module) {
  // Code section that will run only if current file is the entry point.
} 

要查找引用了当前模块的 CommonJS 模块,可以使用 require.cachemodule.children

const moduleParents = Object.values(require.cache)
  .filter((m) => m.children.includes(module)); 

DEP0145: socket.bufferSize#

类型:仅文档

socket.bufferSize 只是 writable.writableLength 的一个别名。

DEP0146: new crypto.Certificate()#

类型:仅文档

crypto.Certificate() 构造函数已被弃用。请改用 crypto.Certificate() 的静态方法

DEP0147: fs.rmdir(path, { recursive: true })#

类型:生命周期结束

fs.rmdirfs.rmdirSyncfs.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 

DEP0148: "exports" 中的文件夹映射(末尾带 "/"#

类型:生命周期结束

subpath exportssubpath imports 字段中使用末尾带 "/" 的方式来定义子路径文件夹映射已不再支持。请改用 subpath patterns

DEP0149: http.IncomingMessage#connection#

类型:仅文档

优先使用 message.socket 而不是 message.connection

DEP0150: 更改 process.config 的值#

类型:生命周期结束

process.config 属性提供了对 Node.js 编译时设置的访问。然而,该属性是可变的,因此容易被篡改。更改该值的功能将在未来版本的 Node.js 中被移除。

DEP0151: 主索引查找和扩展名搜索#

类型:运行时

以前,即使在解析 ES 模块时,index.js 和扩展名搜索查找也会应用于 import 'pkg' 的主入口点解析。

此弃用后,所有 ES 模块的主入口点解析都需要一个明确的 "exports""main" 条目,并带有确切的文件扩展名。

DEP0152: 扩展 PerformanceEntry 属性#

类型:生命周期结束

'gc''http2''http' 类型的 <PerformanceEntry> 对象过去被分配了额外的属性以提供更多信息。这些属性现在可通过 PerformanceEntry 对象的标准 detail 属性获得。已弃用的访问器已被移除。

DEP0153: dns.lookupdnsPromises.lookup 选项的类型强制转换#

类型:生命周期结束

dns.lookup()dnsPromises.lookup() 中,为 family 选项使用非 nullish 且非整数的值,为 hints 选项使用非 nullish 且非数字的值,为 all 选项使用非 nullish 且非布尔值的值,或为 verbatim 选项使用非 nullish 且非布尔值的值,将会抛出 ERR_INVALID_ARG_TYPE 错误。

DEP0154: RSA-PSS 密钥对生成选项#

类型:生命周期结束

请使用 'hashAlgorithm' 替代 'hash',使用 'mgf1HashAlgorithm' 替代 'mgf1Hash'

DEP0155: 模式说明符解析中的末尾斜杠#

类型:运行时

对于包的 "exports""imports" 模式解析,重映射以 "/" 结尾的说明符(如 import 'pkg/x/')已被弃用。

DEP0156: http 中的 .aborted 属性和 'abort''aborted' 事件#

类型:仅文档

请迁移到 <Stream> API,因为 http.ClientRequesthttp.ServerResponsehttp.IncomingMessage 都是基于流的。请检查 stream.destroyed 而不是 .aborted 属性,并监听 'close' 事件而不是 'abort''aborted' 事件。

.aborted 属性和 'abort' 事件仅用于检测 .abort() 调用。要提前关闭请求,请使用流的 .destroy([error]),然后检查 .destroyed 属性和 'close' 事件应具有相同的效果。接收端还应检查 http.IncomingMessage 上的 readable.readableEnded 值,以确定是中止销毁还是正常销毁。

DEP0157: 流中对 thenable 的支持#

类型:生命周期结束

Node.js 流的一个未写入文档的特性是支持在实现方法中使用 thenable。这现已弃用,请改用回调,并避免在流的实现方法中使用 async 函数。

此特性导致用户遇到意外问题,例如用户以回调风格实现函数,但使用了 async 方法,这会因为混合使用 promise 和回调语义而导致错误。

const w = new Writable({
  async final(callback) {
    await someOp();
    callback();
  },
}); 

DEP0158: buffer.slice(start, end)#

类型:仅文档

此方法已被弃用,因为它与 Uint8Array.prototype.slice() 不兼容,而后者是 Buffer 的超类。

请改用功能相同的 buffer.subarray

DEP0159: ERR_INVALID_CALLBACK#

类型:生命周期结束

此错误代码已被移除,因为它给用于值类型验证的错误带来了更多困惑。

DEP0160: process.on('multipleResolves', handler)#

类型:生命周期结束

此事件已被弃用并移除,因为它不适用于 V8 的 promise 组合器,这削弱了它的实用性。

DEP0161: process._getActiveRequests()process._getActiveHandles()#

类型:仅文档

process._getActiveHandles()process._getActiveRequests() 函数不适用于公共用途,并可能在未来版本中移除。

请使用 process.getActiveResourcesInfo() 来获取活动资源类型的列表,而不是实际的引用。

DEP0162: fs.write()fs.writeFileSync() 强制转换为字符串#

类型:生命周期结束

隐式地将具有自身 toString 属性的对象(作为第二个参数传递给 fs.write()fs.writeFile()fs.appendFile()fs.writeFileSync()fs.appendFileSync())强制转换为字符串的做法已被弃用。请将它们转换为原始字符串。

DEP0163: channel.subscribe(onMessage)channel.unsubscribe(onMessage)#

类型:弃用已撤销

这些方法已被弃用,因为如果用户没有强引用通道对象,它们的使用可能导致通道对象被垃圾回收。此弃用已被撤销,因为当通道有活动订阅者时,通道对象现在可以抵抗垃圾回收。

DEP0164: process.exit(code)process.exitCode 强制转换为整数#

类型:生命周期结束

对于 process.exit()code 参数以及赋给 process.exitCode 的值,除 undefinednull、整数和整数字符串(例如 '1')以外的值已被弃用。

DEP0165: --trace-atomics-wait#

类型:生命周期结束

--trace-atomics-wait 标志已被移除,因为它使用了 V8 的钩子 SetAtomicsWaitCallback,该钩子将在未来的 V8 版本中被移除。

DEP0166: 导入和导出目标中的双斜杠#

类型:运行时

包的导入和导出目标映射到包含双斜杠("/""\")的路径已被弃用,并将在未来版本中因解析验证错误而失败。此弃用同样适用于以斜杠开头或结尾的模式匹配。

DEP0167: 弱 DiffieHellmanGroup 实例 (modp1, modp2, modp5)#

类型:仅文档

众所周知的 MODP 组 modp1modp2modp5 已被弃用,因为它们无法抵御实际攻击。详情请见 RFC 8247 Section 2.4

这些组可能会在 Node.js 的未来版本中被移除。依赖这些组的应用程序应评估改用更强的 MODP 组。

DEP0168: Node-API 回调中的未处理异常#

类型:运行时

在 Node-API 回调中隐式抑制未捕获异常的做法现已弃用。

设置 --force-node-api-uncaught-exceptions-policy 标志,以强制 Node.js 在 Node-API 回调中未处理异常时触发 'uncaughtException' 事件。

DEP0169: 不安全的 url.parse()#

类型:应用程序(仅限非 node_modules 代码)

url.parse() 的行为未经标准化,容易出错并存在安全隐患。请改用 WHATWG URL API。对于 url.parse() 的漏洞,不会发布 CVE。

DEP0170: 使用 url.parse() 时端口无效#

类型:生命周期结束

url.parse() 过去接受端口不是数字的 URL。这种行为可能导致在处理意外输入时发生主机名欺骗。这些 URL 现在会抛出错误(WHATWG URL API 也是如此)。

DEP0171: http.IncomingMessage 的 headers 和 trailers 的设置器#

类型:仅文档

在 Node.js 的未来版本中,message.headersmessage.headersDistinctmessage.trailersmessage.trailersDistinct 将变为只读。

DEP0172: AsyncResource 绑定函数的 asyncResource 属性#

类型:生命周期结束

旧版本的 Node.js 会在函数绑定到 AsyncResource 时添加 asyncResource 属性。现在不再这样做了。

DEP0173: assert.CallTracker#

类型:生命周期结束

assert.CallTracker API 已被移除。

DEP0174: 对返回 Promise 的函数调用 promisify#

类型:运行时

对返回 Promise 的函数调用 util.promisify 将忽略该 promise 的结果,这可能导致未处理的 promise rejection。

DEP0175: util.toUSVString#

类型:仅文档

util.toUSVString() API 已被弃用。请改用 String.prototype.toWellFormed

DEP0176: fs.F_OK, fs.R_OK, fs.W_OK, fs.X_OK#

类型:生命周期结束

直接在 node:fs 上暴露的 F_OKR_OKW_OKX_OK getter 已被移除。请从 fs.constantsfs.promises.constants 获取它们。

提供了一个自动迁移工具(源码)。

npx codemod@latest @nodejs/fs-access-mode-constants 

DEP0177: util.types.isWebAssemblyCompiledModule#

类型:生命周期结束

util.types.isWebAssemblyCompiledModule API 已被移除。请改用 value instanceof WebAssembly.Module

DEP0178: dirent.path#

类型:生命周期结束

由于在不同发布版本之间缺乏一致性,dirent.path 属性已被移除。请改用 dirent.parentPath

DEP0179: Hash 构造函数#

类型:运行时

直接使用 Hash()new Hash() 调用 Hash 类的做法已被弃用,因为它们是内部实现,不供公共使用。请使用 crypto.createHash() 方法创建 Hash 实例。

DEP0180: fs.Stats 构造函数#

类型:运行时

直接使用 Stats()new Stats() 调用 fs.Stats 类的做法已被弃用,因为它们是内部实现,不供公共使用。

DEP0181: Hmac 构造函数#

类型:运行时

直接使用 Hmac()new Hmac() 调用 Hmac 类的做法已被弃用,因为它们是内部实现,不供公共使用。请使用 crypto.createHmac() 方法创建 Hmac 实例。

DEP0182: 没有显式 authTagLength 的短 GCM 认证标签#

类型:运行时

打算使用比默认认证标签长度更短的认证标签的应用程序,必须将 crypto.createDecipheriv() 函数的 authTagLength 选项设置为适当的长度。

对于 GCM 模式的密码,decipher.setAuthTag() 函数接受任何有效长度的认证标签(见 DEP0090)。这种行为已被弃用,以便更好地遵循 NIST SP 800-38D 的建议。

DEP0183: 基于 OpenSSL 引擎的 API#

类型:仅文档

OpenSSL 3 已弃用对自定义引擎的支持,并建议切换到其新的 provider 模型。https.request()tls.createSecureContext()tls.createServer()clientCertEngine 选项;tls.createSecureContext()privateKeyEngineprivateKeyIdentifier;以及 crypto.setEngine() 都依赖于 OpenSSL 的此项功能。

DEP0184: 不使用 new 实例化 node:zlib#

类型:运行时

不使用 new 限定符来实例化由 node:zlib 模块导出的类的做法已被弃用。建议改用 new 限定符。这适用于所有 Zlib 类,例如 DeflateDeflateRawGunzipInflateInflateRawUnzipZlib

DEP0185: 不使用 new 实例化 node:repl#

类型:生命周期结束

不使用 new 限定符来实例化由 node:repl 模块导出的类的做法已被弃用。必须改用 new 限定符。这适用于所有 REPL 类,包括 REPLServerRecoverable

DEP0187: 向 fs.existsSync 传递无效参数类型#

类型:运行时

传递不支持的参数类型已被弃用,在未来版本中将抛出错误,而不是返回 false

DEP0188: process.features.ipv6process.features.uv#

类型:仅文档

这些属性的值无条件为 true。任何基于这些属性的检查都是多余的。

DEP0189: process.features.tls_*#

类型:仅文档

process.features.tls_alpnprocess.features.tls_ocspprocess.features.tls_sni 已被弃用,因为它们的值保证与 process.features.tls 的值相同。

DEP0190: 在 shell 选项为 true 的情况下向 node:child_processexecFile/spawn 传递 args#

类型:运行时

当向 child_process.execFilechild_process.spawn 传递一个 args 数组并设置选项 { shell: true } 时,这些值不会被转义,只是用空格分隔,这可能导致 shell 注入。

DEP0191: repl.builtinModules#

类型:仅文档(支持 --pending-deprecation

node:repl 模块导出了一个 builtinModules 属性,它包含一个内置模块的数组。这个列表不完整,并且与已弃用的 repl._builtinLibs (DEP0142) 相同,更好的方法是依赖 require('node:module').builtinModules

DEP0192: require('node:_tls_common')require('node:_tls_wrap')#

类型:运行时

node:_tls_commonnode:_tls_wrap 模块已被弃用,因为它们应被视为 Node.js 的内部实现而非面向公众的 API,请改用 node:tls

DEP0193: require('node:_stream_*')#

类型:运行时

node:_stream_duplexnode:_stream_passthroughnode:_stream_readablenode:_stream_transformnode:_stream_wrapnode:_stream_writable 模块已被弃用,因为它们应被视为 Node.js 的内部实现而非面向公众的 API,请改用 node:stream

DEP0194: HTTP/2 优先级信令#

类型:生命周期结束

RFC 9113 中被弃用后,对优先级信令的支持已被移除。

DEP0195: 不使用 new 实例化 node:http#

类型:仅文档

不使用 new 限定符来实例化由 node:http 模块导出的类的做法已被弃用。建议改用 new 限定符。这适用于所有 http 类,例如 OutgoingMessageIncomingMessageServerResponseClientRequest

提供了一个自动迁移工具(源码)。

npx codemod@latest @nodejs/http-classes-with-new 

DEP0196: 调用 node:child_process 函数时将 options.shell 设为空字符串#

类型:仅文档

调用进程生成函数时使用 { shell: '' } 几乎可以肯定是无意的,并且可能导致异常行为。

要让 child_process.execFilechild_process.spawn 调用默认 shell,请使用 { shell: true }。如果不想调用 shell(默认行为),可以省略 shell 选项,或将其设置为 false 或一个 nullish 值。

要让 child_process.exec 调用默认 shell,可以省略 shell 选项,或将其设置为一个 nullish 值。如果不想调用 shell,请改用 child_process.execFile

DEP0197: util.types.isNativeError()#

类型:仅文档

util.types.isNativeError API 已被弃用。请改用 Error.isError

提供了一个自动迁移工具(源码)。

npx codemod@latest @nodejs/types-is-native-error 

DEP0198: 创建 SHAKE-128 和 SHAKE-256 摘要时未显式指定 options.outputLength#

类型:运行时

创建 SHAKE-128 和 SHAKE-256 摘要时未显式指定 options.outputLength 的做法已被弃用。

DEP0199: require('node:_http_*')#

类型:仅文档

node:_http_agentnode:_http_clientnode:_http_commonnode:_http_incomingnode:_http_outgoingnode:_http_server 模块已被弃用,因为它们应被视为 Node.js 的内部实现而非面向公众的 API,请改用 node:http

DEP0200: 在垃圾回收时关闭 fs.Dir#

类型:仅文档

允许 fs.Dir 对象在垃圾回收时被关闭的做法已被弃用。未来这样做可能会导致抛出错误并终止进程。

请确保所有 fs.Dir 对象都使用 Dir.prototype.close()using 关键字显式关闭。

import { opendir } from 'node:fs/promises';

{
  await using dir = await opendir('/async/disposable/directory');
} // Closed by dir[Symbol.asyncDispose]()

{
  using dir = await opendir('/sync/disposable/directory');
} // Closed by dir[Symbol.dispose]()

{
  const dir = await opendir('/unconditionally/iterated/directory');
  for await (const entry of dir) {
    // process an entry
  } // Closed by iterator
}

{
  let dir;
  try {
    dir = await opendir('/legacy/closeable/directory');
  } finally {
    await dir?.close();
  }
}