Node.js http模块实现API数据转发及Cannot set headers报错排查
问题分析与修复
你的代码存在几个关键问题,直接导致了错误和功能异常:
- 未向客户端返回响应:你在
response.on('end')回调里return transfers完全无效——这个回调是异步执行的,express路由函数早就执行完毕,必须用res.json()/res.send()这类方法主动向客户端返回数据。 - 变量名拼写错误:
console.log(transfer)里的transfer应为transfers,拼写错误会导致控制台报错。 - 请求未发送:调用
http.request()后必须执行.end()来完成请求发送,否则第二个API根本收不到你的请求。 - 错误未反馈给客户端:请求出错时只在控制台打印错误,客户端会一直处于等待状态,应该返回错误响应。
修正后的代码
const express = require('express'); const router = express.Router(); const auth = require('../../middleware/auth') const users = require('../../config/List'); const config = require('config'); const http = require('http'); router.post('/', auth, (req, res) => { console.log("auth route" + req.email); const queryEmail = "?email=" + req.email; const options = { hostname: 'website', path: '/api/auth' + queryEmail, method: 'POST', port: 2000, headers: { 'authtoken': req.header('authtoken') } }; // 发送请求 const reqToApi = http.request(options, (response) => { let data = '' response.on('data', (chunk) => { data += chunk; }); response.on('end', () => { try { const transfers = JSON.parse(data); console.log(transfers); // 向客户端返回处理后的数据 res.json(transfers); } catch (parseErr) { // 处理JSON解析错误 res.status(500).json({ error: '解析API响应失败' }); } }); }).on("error", (err) => { console.log("Error: ", err); // 向客户端返回错误信息 res.status(500).json({ error: err.message }); }); // 必须调用end()完成请求发送 reqToApi.end(); }); module.exports = router;
关键修改说明
- 在
response.on('end')回调中用res.json(transfers)向客户端返回数据,这是express发送响应的标准方式。 - 修复了变量名拼写错误,确保控制台能正确打印返回数据。
- 添加
reqToApi.end()完成请求发送,保证第二个API能收到你的请求。 - 增加JSON解析错误捕获和请求错误的客户端反馈,避免客户端无限等待。
- 移除了不必要的
async关键字(当前用回调式http请求,未用到await),后续如果改用axios等Promise式工具,可再添加async/await简化代码。
内容的提问来源于stack exchange,提问作者syam ps
相关产品推荐
相关产品推荐

