错误:发送后无法设置标题。 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}); }); } }); }); 

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

假设你的page()函数是同步的,你只需要在循环结束后移动一些语句,而不是在循环内部移动你的datavariables的声明,所以你可以用循环来累积数据:

 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()操作返回一个错误,你也应该有一些error handling。 就目前而言,你只是从不回应这个要求。

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