1

mongoose、express、mongodb を使用して node.js アプリを実行しています。現時点では、データベース内のチームのリストを表示する「チーム」ページがあります。以前はまったく問題なく機能していましたが、以下のコードを追加したため....ページに移動して表示できます。その後、ページを更新するか、チームページをもう一度読み込もうとすると、ページがタイムアウトして読み込まれませんが、端末には表示されます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

問題は次のTeam.getAllMetaとおりです。

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

何度も合格したことに注目してくださいcb。複数回呼び出され、2 回目はエラーが発生します。したがって、行next(err);は 2 回起動します。初めて、それはあなたが望むことをします。2 回目errは null ではなく、デフォルトのエラー ハンドラに送られ、エラーに関する応答を作成しようとしますが、ヘッダーが既に送信されているため失敗します。これを 2 回行うことはできません。

于 2013-01-28T21:00:52.730 に答える
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 に答える