Node.js와 함께 MongoDB를 사용하는 방법을 찾으려고 노력해 왔으며 문서에서 제안 된 방법은 콜백을 사용하는 것 같습니다. 자, 나는 그것이 단지 선호도의 문제라는 것을 알고 있지만, 나는 정말로 promise를 사용하는 것을 선호합니다.
문제는 MongoDB와 함께 사용하는 방법을 찾지 못했다는 것입니다. 실제로 다음을 시도했습니다.
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/example';
MongoClient.connect(url).then(function (err, db) {
console.log(db);
});
결과는 undefined
입니다. 이 경우에는 이것이 방법이 아닌 것 같습니다.
콜백 대신 프라 미스와 함께 Node 내부에서 mongo db를 사용하는 방법이 있습니까?
답변
당신의 접근 방식은 거의 정확합니다.
var MongoClient = require('mongodb').MongoClient
var url = 'mongodb://localhost:27017/example'
MongoClient.connect(url)
.then(function (db) { // <- db as first argument
console.log(db)
})
.catch(function (err) {})
답변
async / await 도 할 수 있습니다.
async function main(){
let client, db;
try{
client = await MongoClient.connect(mongoUrl, {useNewUrlParser: true});
db = client.db(dbName);
let dCollection = db.collection('collectionName');
let result = await dCollection.find();
// let result = await dCollection.countDocuments();
// your other codes ....
return result.toArray();
}
catch(err){ console.error(err); } // catch any mongo error here
finally{ client.close(); } // make sure to close your connection after
}
답변
위의 답변 중 블루 버드 나 q 또는 다른 멋진 라이브러리없이이 작업을 수행하는 방법을 언급하지 않았으므로 여기에 2 센트를 추가하겠습니다.
네이티브 ES6 프라 미스로 삽입하는 방법은 다음과 같습니다.
'use strict';
const
constants = require('../core/constants'),
mongoClient = require('mongodb').MongoClient;
function open(){
// Connection URL. This is where your mongodb server is running.
let url = constants.MONGODB_URI;
return new Promise((resolve, reject)=>{
// Use connect method to connect to the Server
mongoClient.connect(url, (err, db) => {
if (err) {
reject(err);
} else {
resolve(db);
}
});
});
}
function close(db){
//Close connection
if(db){
db.close();
}
}
let db = {
open : open,
close: close
}
module.exports = db;
내 open () 메서드를 약속을 반환하는 것으로 정의했습니다. 삽입을 수행하려면 아래 코드 스 니펫이 있습니다.
function insert(object){
let database = null;
zenodb.open()
.then((db)=>{
database = db;
return db.collection('users')
})
.then((users)=>{
return users.insert(object)
})
.then((result)=>{
console.log(result);
database.close();
})
.catch((err)=>{
console.error(err)
})
}
insert({name: 'Gary Oblanka', age: 22});
도움이되기를 바랍니다. 더 나아질 수있는 제안이 있으면 나 자신을 개선 할 의향이 있으므로 알려주세요. 🙂
답변
이것은 Node.js에서 Promise와 함께 MongoDB를 사용하는 방법에 대한 일반적인 대답입니다 .
mongodb는 콜백 매개 변수가 생략되면 promise를 반환합니다.
Promise로 전환하기 전에
var MongoClient = require('mongodb').MongoClient,
dbUrl = 'mongodb://db1.example.net:27017';
MongoClient.connect(dbUrl,function (err, db) {
if (err) throw err
else{
db.collection("users").findOne({},function(err, data) {
console.log(data)
});
}
})
Promise로 전환 후
//converted
MongoClient.connect(dbUrl).then(function (db) {
//converted
db.collection("users").findOne({}).then(function(data) {
console.log(data)
}).catch(function (err) {//failure callback
console.log(err)
});
}).catch(function (err) {})
여러 요청을 처리해야하는 경우
MongoClient.connect(dbUrl).then(function (db) {
/*---------------------------------------------------------------*/
var allDbRequest = [];
allDbRequest.push(db.collection("users").findOne({}));
allDbRequest.push(db.collection("location").findOne({}));
Promise.all(allDbRequest).then(function (results) {
console.log(results);//result will be array which contains each promise response
}).catch(function (err) {
console.log(err)//failure callback(if any one request got rejected)
});
/*---------------------------------------------------------------*/
}).catch(function (err) {})
답변
경고 편집 :
John Culviner가 지적했듯이이 답변은 더 이상 사용되지 않습니다. 드라이버를 사용하면 OOTB 약속이 함께 제공됩니다.
bluebird를 promise 라이브러리로 사용하기로 선택한 경우 promisifyAll()
MongoClient에서 bluebirds 함수를 사용할 수 있습니다 .
var Promise = require('bluebird');
var MongoClient = Promise.promisifyAll(require('mongodb').MongoClient);
var url = 'mongodb://localhost:27017/example';
MongoClient.connectAsync(url).then(function (db) {
console.log(db);
}).catch(function(err){
//handle error
console.log(err);
});
답변
파티에 조금 늦었다는 것을 알고 있지만 ES6를 사용하여 예제를 공유하고 싶습니다.
const config = require('config');
const MongoClient = require('mongodb').MongoClient;
var _connection;
var _db;
const closeConnection = () => {
_connection.close();
}
/**
* Connects to mongodb using config/config.js
* @returns Promise<Db> mongo Db instance
*/
const getDbConnection = async () => {
if (_db) {
return _db;
}
console.log('trying to connect');
const mongoClient = new MongoClient(config.mongodb.url, { useNewUrlParser: true });
_connection = await mongoClient.connect();
_db = _connection.db(config.mongodb.databaseName);
return _db;
}
module.exports = { getDbConnection, closeConnection };
여기에서 좀 더 자세히 살펴 보겠습니다.
https://medium.com/swlh/how-to-connect-to-mongodb-using-a-promise-on-node-js-59dd6c4d44a7
답변
다음과 같은 대체 패키지를 사용 mongodb-promise
하거나 mongodb
주변에 자신의 약속을 구축하거나 다음과 같은 약속 유틸리티 패키지를 통해 패키지 API를 수동으로 약속 할 수 있습니다.bluebird.promisify