You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Node.js HTTP模块解析localhost的DNS?

问题分析与解决方案

核心原因

你混淆了Node.js原生http模块与第三方request库的API用法,导致请求逻辑出错,触发了不必要的localhost DNS解析:

  1. 原生http.request不支持url和json选项,也不会将错误传入回调函数;
  2. 错误的参数格式让Node.js无法正确识别目标IP(127.0.0.1),内部逻辑错误地发起了localhost的DNS查询;
  3. 你的系统使用DoH且代理拦截了所有HTTP/S请求,导致DNS解析失败,抛出EAI_AGAIN错误。

修复方案

方案1:正确使用原生http模块

手动拆分URL、序列化请求体并监听错误事件,直接指定IP避免DNS解析:

const http = require('http');
const url = require('url');

const proxy = process.env.HTTP_PROXY;
const targetUrl = `${proxy}/session/${sessionId}/claim`;
const parsedUrl = url.parse(targetUrl);

// 序列化请求体
const postData = JSON.stringify({
  requestToken: claimToken,
  requiredPermissions: ["read"]
});

const options = {
  hostname: parsedUrl.hostname, // 直接使用127.0.0.1,跳过DNS解析
  port: parsedUrl.port,
  path: parsedUrl.path,
  method: "POST",
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': Buffer.byteLength(postData)
  }
};

const req = http.request(options, (res) => {
  let responseData = '';

  // 收集响应数据
  res.on('data', (chunk) => {
    responseData += chunk;
  });

  // 处理完成的响应
  res.on('end', () => {
    try {
      const result = JSON.parse(responseData);
      const accessToken = result.cap;
      console.log(accessToken);
    } catch (parseErr) {
      console.error('响应解析失败:', parseErr);
    }
  });
});

// 必须监听请求错误,避免未捕获异常
req.on('error', (err) => {
  console.error('请求出错:', err);
});

// 发送请求体并结束请求
req.write(postData);
req.end();

方案2:使用第三方请求库简化逻辑

如果不想手动处理原生模块的繁琐细节,可以使用axios这类封装好的库,它支持直接传入URL且会自动处理IP地址(无需DNS解析):

const axios = require('axios');

const proxy = process.env.HTTP_PROXY;
const targetUrl = `${proxy}/session/${sessionId}/claim`;

axios.post(targetUrl, {
  requestToken: claimToken,
  requiredPermissions: ["read"]
})
.then((response) => {
  const accessToken = response.data.cap;
  console.log(accessToken);
})
.catch((err) => {
  console.error('请求出错:', err);
});

关键说明

当直接指定hostname: '127.0.0.1'时,Node.js会跳过DNS解析步骤,直接建立TCP连接,完全避免了DoH请求被代理拦截的问题,确保代码能在任意Linux系统上运行。

内容的提问来源于stack exchange,提问作者gischer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:04:53