我有点新节点和堆栈这个错误很长一段时间。请帮助我解决我的问题。 这是我的代码:
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});
});
}
});
});
答案 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标头。不是直接相关,而是另一种可能出现这种问题的情况。