Skip to content

Node.js v20.0.0 ERR_SOCKET_CONNECTION_TIMEOUT 错误

Posted on:2023年10月19日 at 19:30

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 错误,您可以使用以下方法解决:

  1. 升级到 Node.js v20.3.0 或更高版本。
  2. 在命令行中添加 dns-result-order=ipv4first 和/或 no-network-family-autoselection 选项。
  3. 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