Node.js中发起HTTP请求无响应问题排查求助
排查Node.js http模块请求无响应的问题
我来帮你梳理下这段代码里的问题,这些错误会导致你无法获取到服务器响应:
几个关键错误点
http.request 不支持
postData配置项
你在请求选项里写的postData是无效的,Node.js的http模块根本不识别这个字段,请求体需要通过请求对象的write方法手动发送。未监听响应事件且未结束请求
调用http.request后,你必须监听response事件来接收服务器返回的内容,而且一定要调用req.end()来结束请求——否则请求会一直处于挂起状态,服务器不会处理也不会返回响应。Buffer 写法过时
新版Node.js中new Buffer()已经被废弃,建议使用Buffer.from()替代,避免运行时警告或报错。请求体格式与Content-Type不匹配
你要发送的是JSON-RPC请求,但代码里设置的是application/x-www-form-urlencoded类型,而且参数格式也不对。JSON-RPC的请求体应该是JSON字符串,对应的Content-Type要设为application/json。
修正后的完整代码
const http = require("http"); const username = "user"; const password = 'pass'; // 构造符合JSON-RPC规范的请求体 const requestBody = JSON.stringify({ jsonrpc: '1.0', id: 'curltest', method: 'decoderawtransaction', params: ['010000000157065146a6b32b224b87d47c1b0283b1ae2fa5bd4f9af9ebc45928110f87fbae0000...'] }); const options = { host: "127.0.0.1", port: 8332, // 建议用数字类型,避免隐式转换问题 path: "/path", method: "POST", headers: { "Authorization": "Basic " + Buffer.from(`${username}:${password}`).toString('base64'), "Content-Type": "application/json", "Content-Length": Buffer.byteLength(requestBody) // 必须设置,告诉服务器请求体的字节长度 } }; const req = http.request(options, (res) => { let responseData = ''; // 接收响应数据片段 res.on('data', (chunk) => { responseData += chunk; }); // 响应接收完成 res.on('end', () => { console.log('服务器响应:', responseData); // 如果需要解析JSON响应,可以用 JSON.parse(responseData) }); }); // 捕获请求过程中的错误(比如连接失败、超时等) req.on('error', (err) => { console.error('请求出错:', err.message); }); // 发送请求体 req.write(requestBody); // 结束请求,告诉服务器已经发送完所有数据 req.end();
额外说明
- 一定要监听
error事件,否则如果请求出现错误(比如目标端口未开放、服务器拒绝连接),程序会直接抛出未捕获的异常。 Content-Length头是必须的,它告诉服务器需要接收多少字节的请求体,否则服务器可能会等待超时或者无法正确解析请求。
内容的提问来源于stack exchange,提问作者coin-o-pedia c
相关产品推荐
相关产品推荐

