2016-09-10 6 views
2

私はエクスプレスアプリを作成しています。ルータではmongodbからデータを取得します。私は、コードを実行し、ブラウザでURLを開くと、ここに私のコードはExpressでエラーが発生しました:送信後にヘッダーを設定できません

router.get('/', function(req, res, next) { 
    MongoClient.connect(url, function(err, db) { 
    db.collection('school').find({}).toArray(function(err, doc) { 
      assert.equal(null, err); 
      assert.ok(doc != null); 
      res.render('index', { title: 'iGyan.org', schools: doc}); 
     }); 

    db.collection('students').find({}).toArray(function(err, doc) { 
      assert.equal(null, err); 
      assert.ok(doc != null); 
      res.render('index', { title: 'iGyan.org',students: doc}); 
     }); 
    db.close(); 
}); 
}); 

あり、それは、私がスタックオーバーフローに尋ねたほぼすべての提案、質問を見てきました

Error: Can't set headers after they are sent. 

を記載し、コンソール上で私にエラーを与えますしかし、それから助けを得ることはできません。

私は、関数内でresを2回レンダリングしているが、状況を克服する方法がわからないため、エラーが発生しています。

答えて

2

dbコールは非同期であるため、レスポンスをレンダリングする前に両方が完了していることを確認する必要があります。 that answerに基づいて、これを達成するためにasync libを使用することができます。

router.get('/', function(req, res, next) { 

    MongoClient.connect(url, function(err, db) { 
     var data = {}; 
     var tasks = [ 
      // Load users 
      function(callback) { 
       db.collection('school').find({}).toArray(function(err, doc) { 
        if (err) return callback(err); 
        data.schools = doc; 
        callback(); 
       }); 
      }, 
      // Load colors 
      function(callback) { 
       db.collection('students').find({}).toArray(function(err, doc) { 
        if (err) return callback(err); 
        data.students: doc; 
        callback(); 
       }); 
      } 
     ]; 

     //This function gets called after the two tasks have called their "task callbacks" 
     async.parallel(tasks, function(err) { 
      //If an error occurred, let express handle it by calling the `next` function 
      if (err) return next(err); 
      db.close(); 
      res.render('index', { 
       title: 'iGyan.org', 
       students: data.students, 
       schools: data.schools 
      }); 
     }); 
    }); 

}); 

出典:

あなたはこのように一度だけ応答をレンダリングすることができ、同じことをやっFetch from multiple, separate, collections with Express and MongoDB

+0

をしかし、私はデータを慰めるとき、それは私を与えます{}。 –

+0

@ iGyan.Org申し訳ありませんが、レンダリングを適切な場所に移動しました。 –

+0

まだデータが{}になっています。 –

関連する問題