찾기 방법에서 Mongoose 결과를 반환하는 방법은 무엇입니까?
몽구스 결과가 있는 페이지를 렌더링하기 위해 찾을 수 있는 모든 것은 다음과 같이 하라고 말합니다.
users.find({}, function(err, docs){
res.render('profile/profile', {
users: docs
});
});
쿼리 결과를 어떻게 반환할 수 있습니까?
var a_users = users.find({}); //non-working example
그러면 여러 결과를 페이지에 게시할 수 있습니까?
예:
/* non working example */
var a_users = users.find({});
var a_articles = articles.find({});
res.render('profile/profile', {
users: a_users
, articles: a_articles
});
할 수 있을까요?
당신은 동기식 패러다임을 강요하려고 합니다.그냥 효과가 없어요.node.js는 대부분 단일 스레드입니다. io가 완료되면 실행 컨텍스트가 생성됩니다.신호 전달은 콜백으로 관리됩니다.즉, 중첩된 콜백, 명명된 함수 또는 흐름 제어 라이브러리를 사용하여 보기를 더 좋게 만들 수 있습니다.
https://github.com/caolan/async#parallel
async.parallel([
function(cb){
users.find({}, cb);
},
function(cb){
articles.find({}, cb);
}
], function(results){
// results contains both users and articles
});
저는 여기서 네크로맨서를 연기할 것입니다. 저는 여전히 다른 더 나은 방법을 보고 있습니다.
훌륭한 약속 라이브러리 Bluebird 및 그 방법을 사용합니다.
var Promise = require('bluebird');
var mongoose = require('mongoose');
Promise.promisifyAll(mongoose); // key part - promisification
var users, articles; // load mongoose models "users" and "articles" here
Promise.props({
users: users.find().execAsync(),
articles: articles.find().execAsync()
})
.then(function(results) {
res.render('profile/profile', results);
})
.catch(function(err) {
res.send(500); // oops - we're even handling errors!
});
주요 부품은 다음과 같습니다.
Promise.promisifyAll(mongoose);
모든 mongoose(및 모델) 메서드를 약속을 반환하는 함수로 사용할 수 있도록 합니다.Async
접미사(.exec()
된다.execAsync()
등). .promisifyAll()
메소드는 노드에서 거의 보편적입니다.JS 월드 - 콜백을 마지막 인수로 사용하는 비동기 함수를 제공하는 모든 항목에서 사용할 수 있습니다.
Promise.props({
users: users.find().execAsync(),
articles: articles.find().execAsync()
})
.props()
bluebird 메서드는 약속을 속성으로 하는 개체를 사용하고 두 데이터베이스 쿼리(여기서는 약속)가 결과를 반환할 때 해결되는 집합 약속을 반환합니다.해결된 값은 당사의results
최종 함수의 객체:
results.users
mongoose에 의해 데이터베이스에서 발견된 사용자results.articles
몽구스(d'uh)가 데이터베이스에서 찾은 기사
보시다시피, 우리는 들여쓰기 콜백 지옥에도 접근하지 못하고 있습니다.두 데이터베이스 쿼리는 모두 병렬로 실행되므로 둘 중 하나가 다른 하나를 기다릴 필요가 없습니다.코드는 짧고 읽을 수 있습니다. 질문 자체에 게시된 희망적인 "비작동 사례"와 실질적으로 일치하는 길이와 복잡성(또는 오히려 부족함)입니다.
약속은 멋집니다.그것들을 사용하세요.
쉬운 방법:
var userModel = mongoose.model('users');
var articleModel = mongoose.model('articles');
userModel.find({}, function (err, db_users) {
if(err) {/*error!!!*/}
articleModel.find({}, function (err, db_articles) {
if(err) {/*error!!!*/}
res.render('profile/profile', {
users: db_users,
articles: db_articles
});
});
});
실제로 Node.js에서는 모든 함수가 비동기식입니다.몽구스의 발견도 마찬가지입니다.그리고 그것을 연속적으로 부르고 싶다면 슬라이드 라이브러리 같은 것을 사용해야 합니다.
그러나 귀하의 경우 가장 쉬운 방법은 콜백을 중첩하거나(예: 이전에 선택한 사용자에 대한 기사를 쿼리할 수 있음) 비동기 라이브러리의 도움으로 완전히 병렬로 수행하는 것이라고 생각합니다(플로우 제어 / 비동기 제품 참조).
나는 노드 기능으로 돌아가기 위해 꽤 많이 사용하는 기능이 있습니다.
function freturn (value, callback){
if(callback){
return callback(value);
}
return value;
};
그러면 모든 서명에 옵션 콜백 매개 변수가 있습니다.
저는 socket.io 과 클라이언트의 DB 액세스를 사용하는 것과 매우 유사한 일을 처리하고 있었습니다.제가 발견한 것은 데이터베이스가 데이터를 얻기 전에 제 DB의 내용을 클라이언트에게 돌려주는 것이었습니다.그래서 제 연구 결과를 여기에 공유하겠습니다.
DB를 검색하기 위한 내 기능:
//게시판 읽기 - DB 완성
var readBoards = function() {
var callback = function() {
return function(error, data) {
if(error) {
console.log("Error: " + error);
}
console.log("Boards from Server (fct): " + data);
}
};
return boards.find({}, callback());
};
내 소켓 이벤트 수신기:
socket.on('getBoards', function() {
var query = dbConnection.readBoards();
var promise = query.exec();
promise.addBack(function (err, boards) {
if(err)
console.log("Error: " + err);
socket.emit('onGetBoards', boards);
});
});
문제를 해결하기 위해 몽구스가 주는 약속을 사용하고 DB에서 데이터를 수신하면 소켓에서 클라이언트로 전송합니다.
무슨 가치가 있건 간에...
다음 코드로 원하는 결과를 얻을 수 있습니다.이것이 당신에게 도움이 되기를 바랍니다.
var async = require('async');
// custom imports
var User = require('../models/user');
var Article = require('../models/article');
var List1Objects = User.find({});
var List2Objects = Article.find({});
var resourcesStack = {
usersList: List1Objects.exec.bind(List1Objects),
articlesList: List2Objects.exec.bind(List2Objects),
};
async.parallel(resourcesStack, function (error, resultSet){
if (error) {
res.status(500).send(error);
return;
}
res.render('home', resultSet);
});
언급URL : https://stackoverflow.com/questions/6180896/how-to-return-mongoose-results-from-the-find-method
'your programing' 카테고리의 다른 글
C/C++ 프로그램에서 ping 실행 (0) | 2023.06.11 |
---|---|
PDB 파일을 만들 수 없습니다. (0) | 2023.05.22 |
글꼴 파일에 특정 유니코드 글리프가 있는지 프로그래밍 방식으로 확인할 수 있는 방법이 있습니까? (0) | 2023.05.22 |
Azure KeyVault: Azure.신원.자격 증명을 사용할 경우예외:DefaultAzureCredential이 포함된 자격 증명에서 토큰을 검색하지 못했습니다. (0) | 2023.05.22 |
Spring Data MongoDB의 List 매개 변수를 사용한 리포지토리 쿼리 (0) | 2023.05.22 |