복붙노트

[MONGODB] 어떻게 블루 버드를 사용하여 MongoDB를 기본 자바 스크립트 드라이버를 promisify 수 있습니까?

MONGODB

어떻게 블루 버드를 사용하여 MongoDB를 기본 자바 스크립트 드라이버를 promisify 수 있습니까?

나는 블루 버드 약속과 MongoDB를 기본 JS 드라이버를 사용하고 싶습니다. 어떻게이 라이브러리에 Promise.promisifyAll ()를 사용할 수 있습니까?

해결법

  1. ==============================

    1.2.0 분기 문서가 더 나은 promisification 가이드를 포함 https://github.com/petkaantonov/bluebird/blob/master/API.md#promisification

    2.0 분기 문서가 더 나은 promisification 가이드를 포함 https://github.com/petkaantonov/bluebird/blob/master/API.md#promisification

    사실은 훨씬 간단 MongoDB의 예를 가지고 :

    var Promise = require("bluebird");
    var MongoDB = require("mongodb");
    Promise.promisifyAll(MongoDB);
    
  2. ==============================

    2.Promise.promisifyAll ()를 사용하는 경우, 그것은 당신의 대상 개체가 인스턴스화해야하는 경우 대상 프로토 타입을 식별하는 데 도움이됩니다. MongoDB를 JS 드라이버의 경우, 상기 기준 패턴은 :

    Promise.promisifyAll ()를 사용하는 경우, 그것은 당신의 대상 개체가 인스턴스화해야하는 경우 대상 프로토 타입을 식별하는 데 도움이됩니다. MongoDB를 JS 드라이버의 경우, 상기 기준 패턴은 :

    그래서, 당신이 할 수있는 https://stackoverflow.com/a/21733446/741970에서 대출 :

    var Promise = require('bluebird');
    var mongodb = require('mongodb');
    var MongoClient = mongodb.MongoClient;
    var Collection = mongodb.Collection;
    
    Promise.promisifyAll(Collection.prototype);
    Promise.promisifyAll(MongoClient);
    

    지금 당신은 할 수 있습니다 :

    var client = MongoClient.connectAsync('mongodb://localhost:27017/test')
        .then(function(db) {
            return db.collection("myCollection").findOneAsync({ id: 'someId' })
        })
        .then(function(item) {
          // Use `item`
        })
        .catch(function(err) {
            // An error occurred
        });
    

    그것은 또한 확인 커서가 컬렉션 # 찾기 ()도 promisified 있습니다에 의해 반환 된 객체 만들기 위해 도움이됩니다 제외하고이 꽤 멀리 가져옵니다. MongoDB를 JS 드라이버에서 커서가 프로토 타입에서 구축되지 않는 () 컬렉션 # 찾기로 돌아왔다. 그래서, 당신은 방법을 포장 커서 매번 promisify 수 있습니다. 당신이 커서를 사용하지 않는, 또는 오버 헤드를 초래하지 않으려면이 필요하지 않습니다. 여기에 한 가지 방법이다 :

    Collection.prototype._find = Collection.prototype.find;
    Collection.prototype.find = function() {
        var cursor = this._find.apply(this, arguments);
        cursor.toArrayAsync = Promise.promisify(cursor.toArray, cursor);
        cursor.countAsync = Promise.promisify(cursor.count, cursor);
        return cursor;
    }
    
  3. ==============================

    3.나는이 여러 번 답을 알지만, 나는이 주제에 대해 좀 더 정보를 추가하고 싶었다. 블루 버드의 자신의 문서 당, 당신은 연결을 청소에 대한 '사용'을 사용하여 메모리 누수를 방지해야한다. 블루 버드 자원 관리

    나는이 여러 번 답을 알지만, 나는이 주제에 대해 좀 더 정보를 추가하고 싶었다. 블루 버드의 자신의 문서 당, 당신은 연결을 청소에 대한 '사용'을 사용하여 메모리 누수를 방지해야한다. 블루 버드 자원 관리

    나는 제대로 이렇게 나는 내가 많은 시행 착오 후에 발견 한 것은 공유하고자합니다, 그래서 정보가 부족이라고 할 수 있겠의 여기 저기를 보았다. 나는 (레스토랑) 아래에 사용 된 데이터는 MongoDB의 샘플 데이터에서왔다. 당신은 여기에를 얻을 수 있습니다 : MongoDB의 데이터 가져 오기

    // Using dotenv for environment / connection information
    require('dotenv').load();
    var Promise = require('bluebird'),
        mongodb = Promise.promisifyAll(require('mongodb'))
        using = Promise.using;
    
    function getConnectionAsync(){
        // process.env.MongoDbUrl stored in my .env file using the require above
        return mongodb.MongoClient.connectAsync(process.env.MongoDbUrl)
            // .disposer is what handles cleaning up the connection
            .disposer(function(connection){
                connection.close();
            });
    }
    
    // The two methods below retrieve the same data and output the same data
    // but the difference is the first one does as much as it can asynchronously
    // while the 2nd one uses the blocking versions of each
    // NOTE: using limitAsync seems to go away to never-never land and never come back!
    
    // Everything is done asynchronously here with promises
    using(
        getConnectionAsync(),
        function(connection) {
            // Because we used promisifyAll(), most (if not all) of the
            // methods in what was promisified now have an Async sibling
            // collection : collectionAsync
            // find : findAsync
            // etc.
            return connection.collectionAsync('restaurants')
                .then(function(collection){
                    return collection.findAsync()
                })
                .then(function(data){
                    return data.limit(10).toArrayAsync();
                });
        }
    // Before this ".then" is called, the using statement will now call the
    // .dispose() that was set up in the getConnectionAsync method
    ).then(
        function(data){
            console.log("end data", data);
        }
    );
    
    // Here, only the connection is asynchronous - the rest are blocking processes
    using(
        getConnectionAsync(),
        function(connection) {
            // Here because I'm not using any of the Async functions, these should
            // all be blocking requests unlike the promisified versions above
            return connection.collection('restaurants').find().limit(10).toArray();
        }
    ).then(
        function(data){
            console.log("end data", data);
        }
    );
    

    나는이 다른 블루 버드 책으로 일을하고 싶었 누가 사람을 도움이되기를 바랍니다.

  4. ==============================

    4.MongoDB를 버전 1.4.9은 이제 쉽게 promisifiable해야한다 :

    MongoDB를 버전 1.4.9은 이제 쉽게 promisifiable해야한다 :

    Promise.promisifyAll(mongo.Cursor.prototype);
    

    자세한 내용은 https://github.com/mongodb/node-mongodb-native/pull/1201를 참조하십시오.

  5. ==============================

    5.우리는 지금 잠시 동안 생산에 다음과 같은 드라이버를 사용하고있다. 기본 Node.js를 드라이버를 통해 그것의 본질적 약속 래퍼. 또한 몇 가지 추가 도우미 기능을 추가합니다.

    우리는 지금 잠시 동안 생산에 다음과 같은 드라이버를 사용하고있다. 기본 Node.js를 드라이버를 통해 그것의 본질적 약속 래퍼. 또한 몇 가지 추가 도우미 기능을 추가합니다.

    포세이돈 - 몽고 - https://github.com/playlyfe/poseidon-mongo

  6. from https://stackoverflow.com/questions/23771853/how-can-i-promisify-the-mongodb-native-javascript-driver-using-bluebird by cc-by-sa and MIT license