请求模块是使express.js设置标头的原因

时间:2017-09-27 13:14:06

标签: node.js express

我使用带有快速和请求模块的节点。在我开始使用请求从另一台服务器获取信息之前,我可以调用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
    }

`

1 个答案:

答案 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