2016-09-10 4 views
2

익스프레스 앱을 만들고 라우터에서 mongodb에서 데이터를 가져 오려고합니다. 여기에 내가 코드를 실행하고 브라우저에서 URL을 열 때, 그것은 내가 거의 모든 제안 질문 스택 오버 플로우에 물어 보았다익스프레스에 오류가 발생했습니다 : 전송 된 후에 헤더를 설정할 수 없습니다

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

을 알리는 콘솔에 나에게 오류를 제공 내 코드

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

입니다, 그러나 그것에서 도움을 얻을 수 없습니다.

나는 함수에서 res를 두 번 렌더링했기 때문에 오류를 알고 있지만 상황을 극복하는 방법을 모른다.

답변

2

db 호출은 비동기이므로 응답을 렌더링하기 전에 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

여전히 데이터에 {}이 표시됩니다. –

관련 문제