sourcetip

Node.js에서 동기식 MongoDB 쿼리를 만드는 올바른 방법은 무엇입니까?

fileupload 2023. 6. 27. 22:30
반응형

Node.js에서 동기식 MongoDB 쿼리를 만드는 올바른 방법은 무엇입니까?

노드를 사용하고 있습니다.MongoDB용 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;
                    });
                });
            }
        });
    });
}

문제는 db.open이 비동기식 통화라는 것입니다(차단하지 않음). 그래서 get.A가 "정의되지 않음"을 반환하고 쿼리 결과를 반환합니다.저는 제가 어떤 종류의 차단 메커니즘을 할 수 있다고 확신하지만, 저는 이런 것을 하는 올바른 방법을 알고 싶습니다.

ES 6(노드 8+)

비동기/대기를 활용할 수 있습니다.

await연산자는 Promise가 해결될 때까지 비동기 함수의 실행을 일시 중지하고 값을 반환합니다.

이렇게 하면 코드가 동기식으로 작동합니다.

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



Older Solution - June 2013 ;)

이제 Mongo Sync를 사용할 수 있습니다. 이것이 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);

참고: 노드 파이버에 따라 다르며 Windows 8에서 몇 가지 문제가 있습니다.

해피 코딩 :)

끔찍한 해킹 없이 동기식으로 만들 방법은 없습니다.올바른 방법은 가지고 있는 것입니다.getAThing콜백 함수를 매개 변수로 수락한 다음 해당 함수를 한 번 호출합니다.thing사용할 수 있습니다.

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+ 업데이트

async이제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;
    }
}

그런 다음 다른 사람에게서 전화를 걸 수 있습니다.async로서 기능하는.let thing = await getAThing();.

하지만, 주목할 필요가 있습니다.MongoClient에서는 연결 풀을 제공하므로 이 방법으로 풀을 열고 닫을 수 없습니다.대신에, 전화하세요.MongoClient.connect앱을 시작하는 동안 다음과 같은 방법으로 단순화합니다.

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

전화하지 않습니다.await메소드 내에서, 대신에 반환된 약속을 직접 반환합니다.findOne.

완전히 동기화되지는 않지만, 제가 반복적으로 채택하고 매우 유용하다는 것을 알게 된 패턴은 co를 사용하고 비동기 기능에 대한 수율을 약속하는 것입니다.mongo의 경우 위 내용을 다시 작성할 수 있습니다.

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 => {

} );

이는 다음을 의미합니다.

  1. 비동기식 라이브러리를 사용하여 "동기식" 코드를 작성할 수 있습니다.
  2. 콜백에서 오류가 발생하므로 성공 여부를 확인할 필요가 없습니다.
  3. 다른 코드 조각에 대한 약속으로 결과를 전달할 수 있습니다.

언급URL : https://stackoverflow.com/questions/12030248/what-is-the-right-way-to-make-a-synchronous-mongodb-query-in-node-js

반응형