【问题标题】:NodeJS 'Can\'t set headers after they are sent.'NodeJS“发送后无法设置标题。”
【发布时间】:2017-03-25 05:56:43
【问题描述】:

我使用 Express 从 twitter 获取 twits 构建了一个应用程序。每次调用都获取 200 个 twits(如果数量较小,则更少),总量为 1800。我使用时间间隔来获取 twits 几次,并将最后一个 twit 的 id 作为下一次调用的第一个 twit 的 id。有时效果很好,但有时我会遇到这个错误:'Can\'t set headers after they are sent。'

我浏览了几个类似的线程,然后更新了我的错误说明以发送空 res 对象。但这并没有改变什么。如何修复我的代码以摆脱这个错误?

T.get('statuses/user_timeline', {screen_name: account, count: 200} , function(err, data){
    if(err){return res.send();};

    var i = 0;
    last_id = data[data.length-1].id_str;
    for(var n in data)
    {
        twits.push({content: data[n].text, date: data[n].created_at});
    }
    if(data.length < 200){
        var twitsToSend = filter(twits);
        return res.send(twitsToSend);       
    }

        var getTwits = setInterval(function()
        {
            T.get('statuses/user_timeline', {screen_name: account, count: 200, max_id: last_id},function(err,data){
                if(err){return res.send();};

                last_id = data[data.length-1].id_str;
                if(data.length < 200){
                    var twitsToSend = filter(twits);
                    return res.send(twitsToSend);

                }
                for(var n in data)
                {
                    twits.push({content: data[n].text, date: data[n].created_at});
                }

            });
                ++i;
                if(i==9)
                    {   
                        clearInterval(getTwits);
                        var twitsToSend = filter(twits);
                        return res.send(twitsToSend);
                    };
        },845);

    });
});

【问题讨论】:

  • 您在每 845 秒发生一次的 setInterval 中多次返回 res.send。在异步获取所有数据之前,您似乎不想调用 res.send()
  • 嘿,这似乎有效。我刚刚在我的条件中创建了额外的 clearInterval 函数。谢谢!

标签: javascript node.js express


【解决方案1】:

您应该将clearInterval(getTwits); 添加到getTwits 函数的内部:

if(data.length < 200){
                clearInterval(getTwits);
                var twitsToSend = filter(twits);
                return res.send(twitsToSend);
            }

现在,如果 Twitter API 返回的结果少于 200 个,请执行 res.send,但永远不要停止间隔计时器,因此它将获取更多结果并再次尝试 res.send,这可能是您的错误的根源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2015-12-20
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多