[MONGODB] Node.js를의 동기 MongoDB의 쿼리를 만들 수있는 올바른 방법은 무엇입니까?
MONGODBNode.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.끔찍한 해킹의 일종 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.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.엄격히 동기 아니지만, 패턴이 나는 반복적으로 채택 매우 유용 비동기 기능에 공동 및 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 => { } );
이 수단 :
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
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를하고 Nodejs으로 삽입 및 쿼리 날짜 (0) | 2019.12.09 |
---|---|
[MONGODB] 어떻게 몽구스와 데이터베이스를 제거하려면? (0) | 2019.12.09 |
[MONGODB] MongoDB의에 포함 된 문서를 필터링 (0) | 2019.12.09 |
[MONGODB] 어레이의 길이만큼 몽고 오더 (0) | 2019.12.09 |
[MONGODB] MongoDB를위한 기본 데이터베이스 경로는 무엇입니까? (0) | 2019.12.09 |