我已经阅读了这段代码一段时间,并搜索了许多其他来源,我知道这个问题已经被回答了很多次。我尝试了多种方法(向res.render添加返回语句、注释掉res.render等)。我不明白为什么我会被抛出“发送后无法设置报头”的错误。
代码如下:
app.post('/',function(req,res){
var context = {};
if(req.body['New List']){
req.session.name = req.body.name;
req.session.toDo = [];
req.session.curId = 0;
}
//If there is no session, go to the main page.
if(!req.session.name){
res.render('newSession', context);
return;
}
if(req.body['Add Item']){
var city = req.body.city;
var minimum = req.body.temp;
console.log("before request");
request('http://api.openweathermap.org/data/2.5/weather?q='+ city +'oh&appid='+myKey, getWeather);
function getWeather(err, response, body){
if(!err && response.statusCode < 400)
{
var weather = JSON.parse(body);
var tempFahrenheit = ((weather.main.temp - 273.15)*1.8) + 32
console.log(tempFahrenheit);
if(tempFahrenheit >= minimum)
{
var doNow = "yes, do this now";
req.session.toDo.push({"name":req.body.name, "id":req.session.curId, "city":req.body.city, "temp":req.body.temp,
"doNow":doNow});
req.session.curId++;
context.name = req.session.name;
context.toDoCount = req.session.toDo.length;
context.toDo = req.session.toDo;
console.log(context.toDo);
return res.render('toDo',context);
}
else
{
var doNow = "no, do this later";
req.session.toDo.push({"name":req.body.name, "id":req.session.curId, "city":req.body.city, "temp":req.body.temp,
"doNow":doNow});
req.session.curId++;
context.name = req.session.name;
context.toDoCount = req.session.toDo.length;
context.toDo = req.session.toDo;
console.log(context.toDo);
return res.render('toDo',context);
}
res.render('toDo', context);
}
else
{
if(response)
{
console.log(response.statusCode);
}
next(err);
}
}
}
if(req.body['Done']){
req.session.toDo = req.session.toDo.filter(function(e){
return e.id != req.body.id;
})
}
/*
context.name = req.session.name;
context.toDoCount = req.session.toDo.length;
context.toDo = req.session.toDo;
console.log(context.toDo);*/
console.log(context.toDo);
res.render('toDo',context);
});
有人知道为什么我会收到这个错误吗?
发布于 2015-11-21 05:40:57
您仍然可能渲染两次。
一次是在你的路由处理程序的末尾使用res.render('toDo', context);
(它总是会执行的),然后是在next(err);
的代码路径中,你的应用程序将以某种方式响应(例如,如果没有其他路由处理程序匹配,Express将返回404)。
https://stackoverflow.com/questions/33839813
复制