node.js - ERR_HTTP_HEADERS_SENT:在 ServerResponse 将标头发送到客户端后无法设置标头
问题描述
我正在尝试使用没有任何数据库的 NodeJS 和 Express 创建一个简单的 REST API。我已将所有数据存储在 JSON 文件中。数据采用对象数组的形式。
我有类似 fund-name/:portId 的路径
所以我这样做:
const fundName = require('./json/fund-name.json');
app.get('/fund-details:portId', (req, res) => {
const portId = req.params.portId;
fundDetails.forEach(fund => {
if (fund.portId === portId) {
return res.json(fund);
}
return res.json([]);
});
});
当我点击 url 时http:localhost:3000/fund-details/1234
,我收到以下错误:
错误 [ERR_HTTP_HEADERS_SENT]:在 ServerResponse.header (/home/username/Desktop/data-server/node_modules/express/lib /response.js:767:10)
当我没有通过任何路径参数来获得所有资金时,它工作正常。我哪里错了??
解决方案
此错误是因为您在单个 api 调用中多次使用 res.send()。
正确的方式
if(a){
res.send()
}else{
res.send()
}
错误的方法
if(a){
res.send()
res.send()
}else{
res.send()
}
在你的代码中。
app.get('/fund-details:portId', (req, res) => {
const portId = req.params.portId;
fundDetails.forEach(fund => {
if (fund.portId === portId) {
return res.json(fund); // many or single times here
}
return res.json([]); // and here when fund !==portId here
});
});
你可以试试
app.get('/fund-details:portId', (req, res) => {
const portId = req.params.portId;
var flag
var data = []
fundDetails.forEach(fund => {
if (fund.portId === portId) {
flag=true
data.push(fund)
}
});
if(flag){
res.send(data);
}else{
res.send()
}
});
推荐阅读
- javascript - 笑话路径映射错误:找不到模块 xyz 映射为:abc
- sql - Oracle 19 数据库是否支持 UUID 列?
- r - 每次在闪亮的应用程序中按下 actionButton 时,都会在存储的 csv 文件中添加一个新列
- windows - 优雅地等待/关闭的脚本/windows 命令
- python - 为什么scrapy不调用该函数?
- javascript - 如何在 javascript 中播放铃声音频(无需用户交互)?
- java - 如何添加另一个链表对象
- c# - 如何在没有 ReSharper (C#) 的情况下在 Visual Studio 中设置用于提取局部变量的键盘快捷键?
- docker - Dockerfile:计算缓存键失败:“/nginx.conf”未找到:未找到
- msal - 如何使用 MSAL 获取访问令牌