如何使用Express将Node.js请求返回的响应体展示到浏览器?
错误原因
你遇到的ERR_HTTP_HEADERS_SENT错误核心原因是同一个请求触发了两次响应发送操作:
- 当
id参数合法时,你调用的request是异步方法,它的回调函数不会立刻执行,主线程代码会继续向下运行,先执行了末尾的res.send({status:400...}),已经给客户端返回了一次响应 - 等
request请求完成触发回调时,你又调用了一次res.send({status:200...}),此时响应头已经发给客户端,无法二次修改,就抛出了这个错误
修复方案
只需要把参数不合法的响应逻辑放到else分支里,保证合法参数场景下不会执行到非法参数的返回逻辑即可,修正后代码如下:
const request = require('request') const express = require('express') const app = express() app.get('/getdata', (req, res) => { if (req.query.id !== undefined && req.query.id !== '') { request('http://localhost/myApi/index.php?id=' + req.query.id, (err, response, body) => { // 新增错误处理,避免上游接口请求异常时触发未知错误 if (err) { return res.send({ status: 500, msg: '接口请求失败' }) } return res.send({ status: 200, data: body }) }) } else { // 把非法参数的返回逻辑移到else分支内 return res.send({ status: 400, msg: 'Parameter invalid' }) } }) app.listen(2000)
额外建议
你用到的request库已经停止维护多年,新项目推荐使用Node.js内置的fetch方法或者axios这类更稳定的请求库来发起网络请求。
内容的提问来源于stack exchange,提问作者Galih Sukristyan Saputra
相关产品推荐
相关产品推荐

