2016-06-10 2 views
3

MongoDB에 단일 연결을 만들고 전역 변수로 돌아 오는 응답 (데이터베이스)을 저장하려고하므로 별도의 JS 파일에서 다시 사용할 수 있습니다. (내 경로에 대한 별도의 파일처럼). 나는이 문서를 예제로 따르고있다 : https://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html#mongoclient-connection-pooling.Node.js + MongoDB 전역 변수 및 범위

첫 번째 시도 : var에 MongoDB를 = 필요 ('MongoDB를'), MongoClient = mongodb.MongoClient, MongoURL = "my_mongodb_url : 포트/데이터베이스 _", global.db;

MongoClient.connect(MongoURL, function(err, database) { 
    db = databse; 
    console.log(db); // shows stuff 
} 

console.log(global.db); // shows undefined 

일부 연구를 통해 문제에 대한 해결책을 찾았습니다. 전역 접두사가있는 노드에 전역 변수를 만듭니다. 하지만 여전히

두 번째 시도 ... 작동하지 않습니다 :

var mongodb = require('mongodb'), 
    MongoClient = mongodb.MongoClient, 
    MongoURL = "my_mongodb_url:port/database_name", 
    global.db; 

MongoClient.connect(MongoURL, function(err, database) { 
    global.db = databse; 
    console.log(db); // shows stuff 
} 

console.log(global.db); // shows undefined 

위의 모든 같은 파일 [app.js]에 넣어 코드입니다. MongoClient의 범위와 관련이 있다고 생각합니다. 그러나 나는 확실하지 않다. 이 일을 할 수있는 방법이 있습니까?

답변

4

사실 그것은 단지 실행 순서 문제입니다. MongoClient.connect(...) 전화는 비동기입니다. 전달중인 콜백 함수는 연결이 설정 될 때까지 호출되지 않습니다. 그러나 마지막에 가지고있는 console.log(global.db)은 바로 호출됩니다. 전에 콜백이 호출됩니다.

실제로 여기에 db을 명시 적으로 전역으로 지정하지 않아도됩니다. 모듈의 외부 범위에 정의 된 변수는 모듈의 전역 범위에 있습니다. global에 값을 연결하면 여러 모듈에서 값을 볼 수 있지만 모듈간에 값을 노출하는 더 좋은 방법은 exports에 값을 첨부하는 것입니다.이 값을 필요에 따라 명시 적으로 가져올 수 있습니다. 이 모듈에서 db 만 사용하는 경우에는 필요하지 않습니다.

+0

나는 그것이 많은 의미가 있다는 것을 알았다! 나는 실제로 다른 모듈, 예를 들어 내가 db 변수를 사용할 라우트 모듈로 작업하고있다. 나는 "수출"을 읽을 것이다. 고마워. :-) –