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)