Node.js中如何强制从6666(不良端口)获取数据?
解决Node.js v18.14.0中fetch访问不良端口的问题
针对你遇到的6666端口被fetch标准判定为不良端口导致请求失败的问题,有以下几种可行方案:
方案1:使用undici的Client API绕过端口检查
Node.js的fetch基于undici实现,直接使用undici的Client可以手动禁用端口验证:
const { Client } = require('undici'); async function fetchSecretService() { // 初始化Client时禁用端口检查 const client = new Client('http://placeholder.com:6666', { portCheck: false }); try { const { body } = await client.request({ path: '/secret-service', method: 'GET' }); // 根据返回数据类型选择json()或text() const result = await body.json(); console.log(result); } catch (error) { console.error('请求失败:', error); } finally { // 记得关闭Client释放资源 await client.close(); } } fetchSecretService();
方案2:改用Node.js原生http模块发起请求
http模块不受fetch标准的端口阻塞规则限制,可以直接请求目标端口:
const http = require('http'); async function fetchFromBadPort() { return new Promise((resolve, reject) => { const request = http.get('http://placeholder.com:6666/secret-service', (response) => { let responseData = ''; // 拼接响应数据 response.on('data', (chunk) => { responseData += chunk; }); // 响应结束后返回结果 response.on('end', () => { resolve(responseData); }); }); // 捕获请求错误 request.on('error', (error) => { reject(error); }); }); } // 调用示例 fetchFromBadPort() .then(data => console.log('响应数据:', data)) .catch(err => console.error('请求出错:', err));
方案3:全局修改undici配置,让fetch支持不良端口
如果需要继续使用全局fetch函数,可以通过设置全局Dispatcher来禁用端口检查:
const { setGlobalDispatcher, Agent } = require('undici'); // 全局设置Agent,禁用端口检查 setGlobalDispatcher(new Agent({ portCheck: false })); async function runFetch() { const response = await fetch('http://placeholder.com:6666/secret-service', { method: 'GET' }); const data = await response.json(); console.log(data); } runFetch();
注意:全局修改会影响所有fetch请求,若有其他正常端口的请求需要遵循标准规则,不推荐此方案。
内容的提问来源于stack exchange,提问作者charlie_pl
相关产品推荐
相关产品推荐

