2016-07-14 42 views
1

林有点新的节点和堆栈很长一段时间,这个错误。请帮我解决我的问题。 这里是我的代码:错误:发送后无法设置标题。 Express.js

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}); 
    }); 
    } 
}); 
}); 

回答

6

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

假设你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()操作返回一个错误。正如它所表达的那样,你只是从不回应请求。

+0

非常感谢,它完全解决了这个问题。 –

6

在快递,方法渲染(),send()方法,JSON()一次可以调用来响应客户端,第二个调用将发出错误:无法设置标题发送后。从你的代码中,res.render()被调用了很多次,因为你在循环中调用它。在调用render()之前检查响应是否完成会更好,或者重写逻辑以仅调用render()。

+0

这是一个合适的答案,这个问题更像是“牢记”之后的事情! – sahilabrar

0

添加行return falseres.render

相关问题