[javascript] Node.js에서 프라 미스와 함께 MongoDB를 사용하는 방법은 무엇입니까?

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