res.send() - 发送后无法设置标头

res.send() - 发送后无法设置标头

问题描述:

我正在使用Node js创建API,并且我有多个参数api的问题。我从couchbase获取多个文档。该API返回多个JSON文档,但在此之后,该程序崩溃。我只拨打res.send()一次。我不明白我要去哪里错了。这是我的API:res.send() - 发送后无法设置标头

router.get("/employee/collectinsert/:_startdate/:_enddate", function(req, res, next){ 

var startDate = moment(req.params._startdate); 
var endDate = moment(req.params._enddate); 
var daysOfYear = []; 
for(var date = moment(startDate); date.diff(endDate,'days') < 1; date.add(1, 'days')){ 
    daysOfYear.push(formatDate(date)); 
} 

bucket.getMulti(daysOfYear,function(err, results){ 
    if(err) throw err; 

    for(var key in results) { 
     if(results.hasOwnProperty(key)) { 
      if(results[key].error) { 
       console.log("`" + key + "`: " + JSON.stringify(results[key])); 
      } 
      res.send(results); 
     } 
    } 
    process.exit(0); 
}); 

});

而且我得到这个错误:

Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11) 
    at ServerResponse.header (C:\Users\ekaplan\Desktop\dashboard\node_modules\express\lib\response.js:730:10) 
    at ServerResponse.send (C:\Users\ekaplan\Desktop\dashboard\node_modules\express\lib\response.js:170:12) 
    at C:\Users\ekaplan\Desktop\dashboard\api\employee.js:53:21 
    at C:\Users\ekaplan\Desktop\dashboard\node_modules\couchbase\lib\bucket.js:1280:9 

要调用res.send()多次,因为它是在一个for循环。将它移到循环之外

因为首先你必须设置这样的标题,如res.header("Access-Control-Allow-Origin", "*");,并且发送一个,就像@ Stretch0所说的那样。

您的res.send处于循环状态,您只能发送一个响应。

你可能想这样做:

bucket.getMulti(daysOfYear,function(err, results){ 
    if(err) throw err; 

    for(var key in results) { 
     if(results.hasOwnProperty(key)) { 
      if(results[key].error) { 
       console.log("`" + key + "`: " + JSON.stringify(results[key])); 
      } 

     } 
    } 
    res.send(results); 
}