2013-01-24 1 views
0

내 JS는 노드에서 이상한 범위 동작 또는 내가 자고 있습니까? 다음과 같이

/* 
* GET home page. 
*/ 

var MongoClient = require('mongodb'); 

exports.index = function(req, res){ 
    var studentObj = {}; 
    MongoClient.connect("mongodb://localhost:27017/MY_DB_TEST", function(err, db) { 
     if(!err) { 
     console.log("We are connected");   

     var collection = db.collection('test');   
     var stream = collection.find().stream(); 

     stream.on("data", function(item){ 
      studentObj = item; 
     });  
     } 
    }); 
    res.render('index', { title: 'Express', obj: studentObj }); 
}; 

내가 , 그 내 구문은,이 페이지를 렌더링하는 시도입니다

h1 Name: #{obj.name} 

JSON : (MongoDB의에서 가져온)

{ 
    name: "Ron", 
    age: 24 
} 

내 studentObj를 glo로 유지하면 작동하지 않습니다. 변수, 즉 require 문 뒤에옵니다.

또한 obj.name은 첫 번째 요청시 렌더링되지 않으며 두 번째 요청의 경우에만 이름 속성을 얻습니다.

왜 이러한 문제가 발생합니까? 나는 아주 사소한 것을 놓치고 있는가?

답변

3

비동기 코드를 동기식으로 처리하려고합니다. 그러지 마.

// Declare local var 
var studentObj = {}; 

// fire off an async request 
MongoClient.connect("mongodb://localhost:27017/MY_DB_TEST", function(err, db) { 

// render, not waiting for data to arrive from server 
res.render('index', { title: 'Express', obj: studentObj }); 

이 글로벌 VAR과 동작을 설명합니다

여기에 코드입니다. 처음에는 렌더링이 아직 비어 있지만 두 번째 렌더링 전에 데이터 요청이 다시 돌아와 전역 변수에 들어갑니다. 해결책은 데이터를 가져온 후에 렌더링합니다.

stream.on("data", function(item){ 
    res.render('index', { title: 'Express', obj: item }); 
}); 
+0

+1 비동기는 여기에 키워드입니다. – Lekensteyn

+0

비동기! * 자아에 대한 참고 사항 * –

2

은 교체 :

res.render('index', { title: 'Express', obj: item }); 

그리고 두 번째 res.render를 제거 :

studentObj = item; 

으로.

렌더링은 mongodb가 돌아 오기를 기다리지 않습니다. 그래서 당신은 데이터를 사용할 수 없습니다.

관련 문제