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 => {
} );
이는 다음을 의미합니다.
- 비동기식 라이브러리를 사용하여 "동기식" 코드를 작성할 수 있습니다.
- 콜백에서 오류가 발생하므로 성공 여부를 확인할 필요가 없습니다.
- 다른 코드 조각에 대한 약속으로 결과를 전달할 수 있습니다.
언급URL : https://stackoverflow.com/questions/12030248/what-is-the-right-way-to-make-a-synchronous-mongodb-query-in-node-js
'sourcetip' 카테고리의 다른 글
워드프레스에서 모든 css 파일을 다양한 플러그인으로 결합하는 방법 (0) | 2023.06.27 |
---|---|
JQuery를 사용하여 Excel 데이터 읽기 (0) | 2023.06.27 |
CLOB 상에서의 Substr 성능 (0) | 2023.06.27 |
'NoneType' 오류로 인해 Google트랜스가 작동을 중지함 개체에 'group' 특성이 없음 (0) | 2023.06.27 |
Python __call__ 특수 메서드 실용적인 예 (0) | 2023.06.27 |