Node.js v20.0.0 中出现了一个 bug,导致无法向某些网站发送 HTTP 请求,并出现 ERR_SOCKET_CONNECTION_TIMEOUT
错误。该 bug 仅出现在 v20.0.0 上,之前的版本和之后的版本都可以正常工作。
目前,该 bug 已经修复,并将在 v20.3.0 中发布。
如果您正在使用 Node.js v20.0.0,v20.1.0 或 v20.2.0,并且遇到了 ERR_SOCKET_CONNECTION_TIMEOUT
错误,您可以使用以下方法解决:
- 升级到 Node.js v20.3.0 或更高版本。
- 在命令行中添加
dns-result-order=ipv4first
和/或no-network-family-autoselection
选项。 - 在
NODE_OPTIONS
环境变量中添加dns-result-order=ipv4first
和/或no-network-family-autoselection
选项。
以下是一个使用 net.setDefaultAutoSelectFamily
方法的解决方法:
const net = require("net");
// work around a node v20 bug: https://github.com/nodejs/node/issues/47822#issuecomment-1564708870
if (net.setDefaultAutoSelectFamily) {
net.setDefaultAutoSelectFamily(false);
}
这是一个更向前兼容的解决方法:
// Work around a node v20.0.0, v20.1.0, and v20.2.0 bug. The issue was fixed
// in v20.3.0.
// https://github.com/nodejs/node/issues/47822#issuecomment-1564708870
// Safe to remove once support for Node v20 is dropped.
if (
// !process.env.IS_BROWSER && // uncomment this line if you use a
// browser-based bundler like Webpack or Parcel
process.version.startsWith("v20.0.") ||
process.version.startsWith("v20.1.") ||
process.version.startsWith("v20.2.")
) {
net.setDefaultAutoSelectFamily(false);
}
上述解决方法仅适用于临时解决问题。如果您正在开发新的项目,建议您直接升级到 Node.js v20.3.0 或更高版本。
原 issus 链接:https://github.com/nodejs/node/issues/47822