【问题标题】:Can't set headers after they are sent - inside looping发送后无法设置标头 - 内部循环
【发布时间】:2017-08-23 17:37:01
【问题描述】:

谁能帮我解决我的一段代码。 我想从nodejs API循环内部发送数据,在我发送错误消息后出现“发送后无法设置标题”。

..这是我的代码:

for (var i =0;i<req.body.stuff.length;i++){
 var arrStuff  = req.body.stuff[i];
 var getUrl    = 'https://someurl/' + arrStuff

 request.get(getUrl,
    function(error,response,body) {
      if (!error && response.statusCode == 200){

        rowData = JSON.parse(body)

        res.send(rowData) // send data to client

      }; // if (!error)

    } // function(error,response,body)
  ); // request.get(getUrl

..终于得到了类似上面标题的错误信息,因为 res.send 已经发送了两次(内部循环),我不知道解决它的最佳方法。

提前致谢

【问题讨论】:

    标签: javascript node.js api


    【解决方案1】:

    我的理解是有人在调用您的 API,然后您正在循环调用多个 API,并且您希望将该数据发送给 API 的调用者。

    您不能多次res.send。一旦执行完毕,API调用就完成了。您已经发送了回复。

    实现您想要的最简单的方法是将循环中获得的响应存储在外部数组中,然后在完成所有调用后,将数组发送到 res.jsonres.send

    使用async.js 处理循环。使用async.concat,您不必自己维护外部数组。

    async.concat(req.body.stuff, function(arrStuff,callback){
    
     var getUrl    = 'https://someurl/' + arrStuff
    
     request.get(getUrl,
        function(error,response,body) {
          if (!error && response.statusCode == 200){
    
            rowData = JSON.parse(body)
    
            callback(null, rowData) // replace null by err to stop if err
    
          }; // if (!error)
    
        } // function(error,response,body)
      ); // request.get(getUrl
    
    }, function(err, allData) {
        res.send(allData)
    });
    

    还有其他方法,例如 socket.io 或类似流的东西,但这正是您所需要的。

    【讨论】:

    • 嗬嗬..非常感谢 Dushyant Bangal,它现在正在工作,真的很有帮助。谢谢..
    • 不客气。请检查我的答案左侧的勾号以“将其标记为答案”,也可能对其他人有所帮助
    【解决方案2】:

    您不能为单个请求发送多个响应。 HTTP 遵循 请求-响应模式 单个请求的单个响应。

    Error: Can't set headers after they are sent 表示您已经处于 Body 或 Finished 状态,但某些函数试图设置 header em> 或 statusCode。即理想情况下是 loop

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2011-10-17
      • 2014-12-06
      • 2015-12-25
      相关资源
      最近更新 更多