我使用带有快速和请求模块的节点。在我开始使用请求从另一台服务器获取信息之前,我可以调用res.json
。但是,只要我在请求中的回调函数中尝试使用res.json
,我就会收到标题已经发送的错误消息。
一种解决方案是将格式标题明确设置为'application/json'
,但我不想打开res.json
。还有其他解决方案吗?这是否是因为快递认为没有设置标题并因此自行发送一个标题?
代码示例: ` router.get(' / app /:action',function(req,res){
switch(req.params.action) {
case "search_gifs":
//res.json(["no problem"]);
request(
{/*some params*/},
function (error, response, body) {
res.json(["error"]);return;
}
);
break;//I didn't add break but nothing is happening in default, but I'll try again with break
}
`
答案 0 :(得分:3)
正如您所说,您收到的错误是header has already been sent.
让我以简单的方式解释你,
您必须根据自己的情况从多个地方写res.json
。
您收到此错误是因为res.json
正在执行多次。
当它第一次执行时它不会给你错误,但第二次它会给你错误,因为已经发送了响应。
你的代码有一些循环漏洞。调试它。
让我试着用这里的例子详细解释你。
const express = require('express');
const app = express();
//
// To generate error
//
app.get('/generate_error', function(req, res) {
//
// When check_error query param is true, It will throw you error else
// all good
//
if (req.query.check_error) {
//
// check_error is true so let's send response first here.
//
res.send('Hello World!');
}
//
// If check_error is true then it will try to send response again for
// same request.
// If check_error is false then it will by send response first time
// here so no error
//
res.send('Hello World!');
});
//
// Solution 1 for above case
//
app.get('/ignore_error_1', function(req, res) {
if (req.query.check_error) {
res.send('Hello World!');
} else {
res.send('Hello World!');
}
});
//
// Solution 2 but different with solution 1
//
app.get('/ignore_error_2', function(req, res) {
if (req.query.check_error) {
//
// When you don't have anything to execute after sending response
// then just add return here.
// In other case you have to manage your code as per your
// requirement if you have anything needs to be executed after
// sending response from multiple places.
// NOTE : Make sure you will not execute res.json multiple times
//
return res.send('Hello World!');
}
return res.send('Hello World!');
});
app.listen(3000, function() {
console.log('Example app listening on port 3000!')
});
执行这三个获取网址
/generate_error?check_error=true
/ignore_error_1?check_error=true
/ignore_error_2?check_error=true