2013-06-13 2 views
17

저는 Node.js와 MongoDB를 처음 접했지만, SO와 mongo에 대한 문서를 함께 사용했습니다. 나는 단지 한 장소에 하나의 함수에서 DB를 사용해야 할 경우 잘 보이는Node.js와 MongoDB, DB 객체 재사용

// Retrieve 
var MongoClient = require('mongodb').MongoClient; 

// Connect to the db 
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) { 
    if(!err) { 
    console.log("We are connected"); 
    } 
}); 

:

몽고의 documentetion은 예제를 제공합니다. SO 검색 및 읽기는 매번 새로운 연결을 열지 말고 풀을 사용하고 처음으로 데이터베이스 개체를 재사용한다는 것을 보여주었습니다. 이 대답은 매우 풍부하지만, 처음에는 DB 객체를 얻는 방법과 다시 사용하는 방법을 잘 모르겠습니다.

내가 내 App.js에 위의 Node.js를 코드가 말해, 나는 다음과 같은 DB에 다른 작업을 실행해야 differnt 한 경로가 있습니다

app.post('/employee', function(req, res){ 
    //Put req.name in database 
}); 


app.post('/car', function(req, res){ 
    //Put req.car in database 
}); 

가 어떻게 넣어 약 갈 것을 이 두 가지 미리보기가 함께 유용한 것으로?

비슷한 질문이 Node.js reuse MongoDB reference에서 발견되었지만이 (http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html)의 모습에서 db()보다는 MongoClient를 사용해야하는 것처럼 보입니다. 그리고 내 문제를 해결할 수 있는지 잘 모르겠다. ...

답변

36

데이터베이스 연결을 초기화하고 프로그램 전체에서 액세스 할 수있는 모듈을 작성할 수 있습니다. 예를 들어 :

mongo.js

var mongodb = require('mongodb'); 

module.exports.init = function (callback) { 
    var server = new mongodb.Server("127.0.0.1", 27017, {}); 
    new mongodb.Db('test', server, {w: 1}).open(function (error, client) { 
    //export the client and maybe some collections as a shortcut 
    module.exports.client = client; 
    module.exports.myCollection = new mongodb.Collection(client, 'myCollection'); 
    callback(error); 
    }); 
}; 

는 app.js

var mongo = require('./mongo.js'); 

//setup express... 

//initialize the db connection 
mongo.init(function (error) { 
    if (error) 
     throw error; 

    app.listen(80); //database is initialized, ready to listen for connections 
}); 

randomFile.js

var mongo = require('./mongo.js'); 

module.exports.doInsert = function() { 
    //use the collection object exported by mongo.js 
    mongo.myCollection.insert({test: 'obj'}, {safe:true}, function(err, objects) { 
    if (err) 
     console.warn(err.message); 
    }); 
}; 

나는 사람들이 풀링에 대해 이야기 알지만, 벤치마킹을했을 때 모든 요청에 ​​대해 단일 연결과 비교하여 mongo 연결을 풀링하는 경우 단일 연결이 실제로 더 잘 수행됩니다. 허락하신다면 1 년 전 이었지만 기본적인 개념이 바뀌 었는지는 의심 스럽습니다. 모든 요청은 비동기식이므로 동시 요청을하기 위해 여러 개의 연결이 필요하지는 않습니다.

MongoClient까지, 나는 그것이 그들이 권장하는 새로운 구문이라고 생각한다. 어쨌든, 사용하는 스타일에 관계없이 계속 유지하고 액세스하려는 것은 본질적으로 클라이언트 개체입니다.

+0

흠, 시도하기 전에 모듈 및 내용을 읽어야합니다. "module.exports.init"는 저에게 wierd처럼 보입니다.하지만 "app.js"의 코드는 한 번만 실행해야하며 "randomFile.js"의 코드는 내가 사용하는 코드입니다 내 app.post ('/ employee')에? 처음으로 모든 App.js 파일에 모든 것이 있습니다. – user2288749

+0

맞습니다.'init' 함수는 한 번만 호출해야합니다. 'randomFile.js'는 코드의 어느 위치에서나 초기화 된 데이터베이스를 사용할 수 있다는 것을 보여주는 예입니다. app.js에서 쉽게 사용할 수 있습니다.노드로 작업 할 경우 모듈이 어떻게 작동하는지 확실히 이해해야하지만 실제로 어렵지는 않습니다. –

+0

시간과 노력에 감사드립니다. 오늘 일하게되었습니다! 내가 서버를 시작할 때 DB에 즉시 5 개의 연결을 받는다. 그렇게 나쁘니? (기본 허용 연결이기 때문에 추측 5) init 호출을 변경했는데 모듈을 사용하는 방법은 http://pastebin.com/QFdZY51F를 참조하십시오. – user2288749

3

마지막 코드 스 니펫에서 Express 또는 유사한 프레임 워크를 사용하는 것처럼 보입니다. express-mongo-db을 사용하면 req 개체 내부에서 연결을 얻을 수 있습니다. 이 미들웨어는 연결을 캐시하여 다른 들어오는 요청과 공유합니다.

app.use(require('express-mongo-db')(require('mongodb'), { db: 'test' })) 
app.post('/employee', function(req, res){ 
    // req.db.collection('names'),insert(req.name) 
    // Put req.name in database 
}); 


app.post('/car', function(req, res){ 
    // req.db.collection('names').insert(req.name) 
    // Put req.car in database 
});