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

Dee*_*HIT 1 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});
  });
  }
});
});
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 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);
            });
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

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


Kie*_* Vo 6

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