복붙노트

[MONGODB] Node.js를의 동기 MongoDB의 쿼리를 만들 수있는 올바른 방법은 무엇입니까?

MONGODB

Node.js를의 동기 MongoDB의 쿼리를 만들 수있는 올바른 방법은 무엇입니까?

나는 MongoDB를위한 Node.js를 드라이버를 사용하고, 나는 그런 것처럼, 동기 쿼리를 수행하고 싶습니다 :

function getAThing()
{
    var db = new mongo.Db("mydatabase", server, {});

    db.open(function(err, db)
    {
        db.authenticate("myuser", "mypassword", function(err, success)
        {
            if (success)
            {
                db.collection("Things", function(err, collection)
                {
                    collection.findOne({ name : "bob"}, function(err, thing)
                    {                           
                        return thing;
                    });
                });
            }
        });
    });
}

문제는 getAThing 반환 "정의되지 않은"내가이 쿼리의 결과를 반환 할 수 있도록 db.open는 asychronous 전화를 (그것이 차단하지 않습니다)입니다입니다. 나는 확신 I 수있는 몇 가지 메커니즘을 차단하는 일종의,하지만 난 이런 식으로 뭔가를 할 수있는 올바른 방법을 알고 싶습니다.

해결법

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

    1.끔찍한 해킹의 일종 O / w이 동기 만들 수있는 방법은 없습니다. 올바른 방법은 getAThing 매개 변수로 콜백 함수를 받아 다음 일을 사용할 수있게되면 그 함수를 호출하는 것입니다.

    끔찍한 해킹의 일종 O / w이 동기 만들 수있는 방법은 없습니다. 올바른 방법은 getAThing 매개 변수로 콜백 함수를 받아 다음 일을 사용할 수있게되면 그 함수를 호출하는 것입니다.

    function getAThing(callback)
    {
        var db = new mongo.Db("mydatabase", server, {});
    
        db.open(function(err, db)
        {
            db.authenticate("myuser", "mypassword", function(err, success)
            {
                if (success)
                {
                    db.collection("Things", function(err, collection)
                    {
                        collection.findOne({ name : "bob"}, function(err, thing)
                        {       
                            db.close();                    
                            callback(err, thing);
                        });
                    });
                }
            });
        });
    }
    

    노드 7.6+ 업데이트

    비동기 / await를 지금 돌려 약속 (기본 MongoDB를 드라이버가하는 것처럼) 비동기 API를 사용할 때 동기 스타일로 코딩하는 방법을 제공합니다.

    이 방법을 사용하여, 위의 방법은 다음과 같이 쓸 수있다 :

    async function getAThing() {
        let db = await mongodb.MongoClient.connect('mongodb://server/mydatabase');
        if (await db.authenticate("myuser", "mypassword")) {
            let thing = await db.collection("Things").findOne({ name: "bob" });
            await db.close();
            return thing;
        }
    }
    

    하자의 일이 기다리고 getAThing을 =로 어떤 당신은) (다른 비동기 함수에서 호출 할 수 있습니다 ;.

    그러나, 그것의 가치는 개방하지 말아야하므로, MongoClient이 연결 풀을 제공한다는 지적이 메소드 내에서 닫을. 대신, 앱 시작시 MongoClient.connect를 호출 한 다음 방법을 단순화 :

    async function getAThing() {
        return db.collection("Things").findOne({ name: "bob" });
    }
    

    우리가 대신 직접 findOne에 의해 반환되는 약속을 반환하는 방법 내에서 await를 호출하지 않아도됩니다.

  2. ==============================

    2.EN (6) (8 + 노드)

    EN (6) (8 + 노드)

    당신은 비동기 / await를 이용할 수있다

    AWAIT 오퍼레이터는 약속이 해결 될 때까지 비동기 함수의 실행을 일시 정지하고 값을 리턴한다.

    코드가 동기 방식으로 작동이 방법 :

    const query = MySchema.findOne({ name: /tester/gi });
    const userData = await query.exec();
    console.log(userData)
    

    이전 솔루션 - 6 월 2013 년)

    이제 몽고 동기화가 가능하며,이 Node.js.의 동기 MongoDB의 쿼리를 만들 수있는 올바른 방법이다

    나도 같은이 사용하고 있습니다. 당신은 다음과 같은 동기화 방법을 쓸 수 있습니다 :

    var Server = require("mongo-sync").Server;
    var server = new Server('127.0.0.1');
    var result = server.db("testdb").getCollection("testCollection").find().toArray();
    console.log(result);
    

    노드 섬유에 미치는 의존과 몇 가지 문제는 윈도우 8에와있다 : 있습니다.

    행복 : 코딩

  3. ==============================

    3.엄격히 동기 아니지만, 패턴이 나는 반복적으로 채택 매우 유용 비동기 기능에 공동 및 promisify 수율을 사용하는 것입니다 발견했습니다. 몽고의 경우를 위 재 작성 수 :

    엄격히 동기 아니지만, 패턴이 나는 반복적으로 채택 매우 유용 비동기 기능에 공동 및 promisify 수율을 사용하는 것입니다 발견했습니다. 몽고의 경우를 위 재 작성 수 :

    var query = co( function* () {
    
        var db = new mongo.Db("mydatabase", server, {});
        db = promisify.object( db );
        db = yield db.open();
    
        yield db.authenticate("myuser", "mypassword");
    
        var collection = yield db.collection("Things");
        return yield collection.findOne( { name : "bob"} );
    
    });
    
    query.then( result => {
    
    } ).catch( err => {
    
    } );
    

    이 수단 :

  4. from https://stackoverflow.com/questions/12030248/what-is-the-right-way-to-make-a-synchronous-mongodb-query-in-node-js by cc-by-sa and MIT license