Node.js – 页面超时 – 发送后无法设置标题
我使用mongoose,快车,mongodb运行node.js应用程序。 我有一个“团队”页面,目前显示的数据库中的团队列表,它以前工作绝对好,但因为我已经在下面的代码中添加….我可以导航到PGE和查看它,之后,如果我刷新页面或尝试再次加载团队页面,页面超时,不加载,但在terminal,它显示GET /team
这里是我添加的代码:
路线/ index.js
var getAllMeta = function(req, res, next){ Team.getAllMeta(function(err, teamsList){ if(!err && teamsList){ req.teamsList = teamsList; } next(err); }); }; app.get('/team', getAllMeta, function(req, res){ util.log('Serving request for url[GET] ' + req.route.path); if(req.session.user){ res.render('team', {'teamsList' : req.teamsList} ); } else { res.redirect('/'); } });
HTML代码是.jade,它只是简单地包含以下代码来使用teamsList来显示团队:
div#teamListDiv -if(teamsList.length > 0){ -each team in teamsList a.teamLink(id="#{team.key}", href="#") #{team.name} br -}else{ h3 No teams till now.. -}
所以它工作得很好,但一旦刷新或重新加载,它就会超时并且什么都不做。 任何帮助深表感谢。
编辑:让它加载后,这是在terminal的错误代码
Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (http.js:645:11) at ServerResponse.res.setHeader (/Users/sweetest_viv/nodeapps/tournamentManager/node_modules/express/node_modules/connect/lib/patch.js:59:22) at next (/Users/sweetest_viv/nodeapps/tournamentManager/node_modules/express/node_modules/connect/lib/proto.js:162:13) at pass (/Users/sweetest_viv/nodeapps/tournamentManager/node_modules/express/lib/router/index.js:107:24) at nextRoute (/Users/sweetest_viv/nodeapps/tournamentManager/node_modules/express/lib/router/index.js:100:7) at callbacks (/Users/sweetest_viv/nodeapps/tournamentManager/node_modules/express/lib/router/index.js:164:11) at Promise.getAllMeta (/Users/sweetest_viv/nodeapps/tournamentManager/routes/index.js:17:5) at Promise.addBack (/Users/sweetest_viv/nodeapps/tournamentManager/node_modules/mongoose/lib/promise.js:128:8) at Promise.EventEmitter.emit (events.js:96:17) at Promise.emit (/Users/sweetest_viv/nodeapps/tournamentManager/node_modules/mongoose/lib/promise.js:66:38)
index.js第17行的代码是
next(err);
这是我上面发布的getAllMeta函数
编辑2:Team.getAllMeta
Team.statics.getAllMeta = function(cb){ var query = this.find({}, 'key name', cb); return query.exec(cb); };
问题出在Team.getAllMeta
:
Team.statics.getAllMeta = function(cb){ var query = this.find({}, 'key name', cb); return query.exec(cb); };
注意你多次通过cb
。 它被多次调用,第二次出错。 因此,你的next(err);
行next(err);
火两次。 第一次,它做你想要的。 第二次, err
是非空的,它会转到默认的error handling程序,它会尝试构build关于错误的响应,但由于头文件已经发送而失败,并且您不能这样做两次。
问题是你的中间件
var getAllMeta = function(req, res, next){ Team.getAllMeta(function(err, teamsList){ if(!err && teamsList){ req.teamsList = teamsList; } next(err); }); };
每次都会调用next(err)
。 即使没有错误。 Express将错误转发给errorHandler,同时您正尝试在/team
路由中呈现您的页面。 因此,错误Can't set headers after they are sent
。
把下面的if () {}
语句放在里面
return next();
这可以防止next(err)
调用next(err)
。