1

我正在使用 mongoose、express、mongodb 运行 node.js 应用程序。我有一个“团队”页面,该页面目前显示数据库中的团队列表,它以前工作得非常好,但是由于我在下面的代码中添加了……我可以导航到 pge 并查看它,并且之后,如果我刷新页面或尝试再次加载团队页面,页面超时并且无法加载,但在终端中它确实显示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..
  -}

所以它工作得很好,但是一旦刷新或重新加载,它就会超时并且什么都不做。任何帮助深表感谢。

编辑:让它加载后,这是终端的错误代码

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);
};
4

2 回答 2

1

问题是你的中间件

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).

于 2013-01-28T19:18:16.347 回答
1

问题出在Team.getAllMeta

Team.statics.getAllMeta = function(cb){
  var query = this.find({}, 'key name', cb);
  return query.exec(cb);
};

注意你是如何cb多次通过的。它被多次调用,第二次出现错误。因此,您的线路next(err);会触发两次。第一次,它做你想做的事。第二次err是非空的,它转到默认的错误处理程序,它尝试构建有关错误的响应,但由于标头已经发送而失败,您不能这样做两次。

于 2013-01-28T21:00:52.730 回答