错误:发送后无法设置标头。 Express.js

时间:2016-07-14 03:41:35

标签: node.js express

我有点新节点和堆栈这个错误很长一段时间。请帮助我解决我的问题。 这是我的代码:

app.get('/', function(req , res){
request(url, function(err, response, html){
if (!err && response.statusCode == 200){
  var page = cheerio.load(html);
  page('.search-result-description').each(function(){
    var data = [];
    var name = page(this).find('.search-result-item__head');
    var company = page(this).find('.search-result-item__company');
    var description = page(this).find('.search-result-item__snippet');
    var requirements = page(this).find('.search-result-item__snippet');
    var salary = page(this).find('.b-vacancy-list-salary');

    data.push({
      vac_name:  name.eq(0).text(),
      vac_description: description.eq(0).text(),
      vac_requirements: requirements.eq(0).text(),
      var_company: company.eq(0).text(),
      vac_salary : salary.eq(0).text()
    });
    data = JSON.stringify(data, null, 4);
    res.render('main.ejs', {data: data});
  });
  }
});
});

4 个答案:

答案 0 :(得分:7)

发送http响应的方法(如res.render())只能在每个请求中调用一次(每个请求只有一个响应)。当您多次调用它们时,您会收到有关已发送标头的错误消息。

假设你的page()函数是同步的,你只需要在循环结束后而不是在循环内部移动几个语句,并将data变量的声明移到循环之外你可以用循环累积数据:

app.get('/', function(req, res) {
    request(url, function(err, response, html) {
        if (!err && response.statusCode == 200) {
            var page = cheerio.load(html);
            var data = [];
            page('.search-result-description').each(function() {
                var name = page(this).find('.search-result-item__head');
                var company = page(this).find('.search-result-item__company');
                var description = page(this).find('.search-result-item__snippet');
                var requirements = page(this).find('.search-result-item__snippet');
                var salary = page(this).find('.b-vacancy-list-salary');

                data.push({
                    vac_name: name.eq(0).text(),
                    vac_description: description.eq(0).text(),
                    vac_requirements: requirements.eq(0).text(),
                    var_company: company.eq(0).text(),
                    vac_salary: salary.eq(0).text()
                });
            });
            res.render('main.ejs', {
               data: JSON.stringify(data, null, 4);
            });
        }
    });
});

如果request()操作返回错误,您还应该进行一些错误处理。就目前而言,你永远不会回应这个请求。

答案 1 :(得分:6)

在express中,方法render(),send(),json()可以调用一次响应客户端,第二次调用将发出错误:在发送之后不能设置头文件。从你的代码中,res.render()被多次调用,因为你在循环中调用它。如果在调用render()之前检查响应是否完成,或者重新调整逻辑以仅调用render(),那么它会更好。

答案 2 :(得分:1)

return false

之后添加第res.render

答案 3 :(得分:0)

另外,在不同的if-else块中或使用回调发送多个响应时,请确保在设置响应后返回null。

让更新=函数(要求,要求,下一步){

Observable

}

这将停止响应的设置,并且不会使执行进一步。因此您不能设置多个res标头。不是直接相关,而是另一种可能出现这种问题的情况。