[MONGODB] 방법 찾기 방법에서 몽구스 결과를 반환?
MONGODB방법 찾기 방법에서 몽구스 결과를 반환?
내가 몽구스 결과 페이지를 렌더링 찾을 수있는 모든 같이 그것을 말한다 :
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
});
이것은 할 수 있습니까?
해결법
-
==============================
1.당신은 동기 패러다임을 강제로 노력하고 있습니다. 그냥 does't 작동합니다. Node.js를 대부분의 경우 단일 스레드입니다 - 입출력이 완료되면, 실행 컨텍스트가 산출된다. 신호는 콜백으로 관리됩니다. 이것이 의미하는 것은 당신이 중 하나를 중첩 콜백, 이름 지정된 함수 또는보고 더 좋은 물건을 만들 수있는 흐름 제어 라이브러리를 가지고있다.
당신은 동기 패러다임을 강제로 노력하고 있습니다. 그냥 does't 작동합니다. Node.js를 대부분의 경우 단일 스레드입니다 - 입출력이 완료되면, 실행 컨텍스트가 산출된다. 신호는 콜백으로 관리됩니다. 이것이 의미하는 것은 당신이 중 하나를 중첩 콜백, 이름 지정된 함수 또는보고 더 좋은 물건을 만들 수있는 흐름 제어 라이브러리를 가지고있다.
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 });
-
==============================
2.나는 아직도 그것을 할 또 다른, 더 나은 방법을 참조 나는 여기 사악을 재생할 수 있습니다.
나는 아직도 그것을 할 또 다른, 더 나은 방법을 참조 나는 여기 사악을 재생할 수 있습니다.
멋진 약속 라이브러리 블루 버드와 promisifyAll () 메소드를 사용하여 :
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);
함수는 비동기 접미사로, 약속을 반환하는 모든 몽구스 (및 모델) 방법을 사용할 수있게하는 것은 (.exec () .execAsync (), 등이된다). .promisifyAll () 메소드는 Node.js를 세계에서 거의 보편적 - 당신은 자신의 마지막 인수로 콜백에 복용 비동기 기능을 제공 아무것도 사용할 수 있습니다.
Promise.props({ users: users.find().execAsync(), articles: articles.find().execAsync() })
.props () 블루 버드 방법은 속성으로 약속 객체에 걸리고, (여기 - 약속) 모두 데이터베이스 쿼리 때 해결됩니다 집단 약속 반환 결과를 반환합니다. 해결 된 값은 우리의 결과는 최종 함수에서 객체이다 :
당신이 볼 수 있듯이, 우리는 심지어 들여 쓰기 콜백 지옥 근처에 점점되지 않습니다. 두 데이터베이스 쿼리를 병렬로 실행 - 그 중 하나에 대한 필요가 다른 대기가 없습니다. 코드는 짧고 읽을 수 - 실질적으로 길이와 복잡성에 해당하는 (또는 오히려 그것의 부족) 문제 자체에 게시 소망 "작동하지 않는 예"를.
약속은 시원하다. 그것을 써.
-
==============================
3.쉬운 방법 :
쉬운 방법 :
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.에서 비동기 그래서 몽구스의 발견이다. 당신이 직렬를 호출 할 경우 그리고 당신은 슬라이드 라이브러리 같은 것을 사용한다.
그러나 귀하의 경우 I (이 이전에 선택한 사용자를위한 f.e. quering 기사 수)하거나 completly 비동기 라이브러리 (흐름 제어 / 비동기 케이크 참조)의 도움으로 평행 않는 가장 쉬운 방법은 중첩 콜백으로 생각합니다.
-
==============================
4.내가 노드 기능에 반환으로 꽤 사용하는 기능을 가지고있다.
내가 노드 기능에 반환으로 꽤 사용하는 기능을 가지고있다.
function freturn (value, callback){ if(callback){ return callback(value); } return value; };
그럼 난 서명 모두의 선택적 콜백 매개 변수가 있습니다.
-
==============================
5.난 아주 비슷한 일을 처리하지만, 클라이언트에서 socket.io 및 DB 액세스를 사용했다. 데이터베이스가 데이터를 얻을 수있는 기회가되기 전에 나의 발견은 그래서 여기 내 연구 결과를 공유 할 것입니다 무엇의 가치에 대한 ... 클라이언트에 내 DB의 뒷면의 내용을 던지고 :
난 아주 비슷한 일을 처리하지만, 클라이언트에서 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에서 데이터를 받으면 ...
어떻게 그 가치에 대한 ...
-
==============================
6.다음 코드로 원하는 결과를 얻을 수 있습니다. 이 당신을 도울 것입니다 바랍니다.
다음 코드로 원하는 결과를 얻을 수 있습니다. 이 당신을 도울 것입니다 바랍니다.
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); });
from https://stackoverflow.com/questions/6180896/how-to-return-mongoose-results-from-the-find-method by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] .save () 및 업데이트를 사용 몽구스 간의 차이 () (0) | 2019.12.05 |
---|---|
[MONGODB] 형식 오류가 : db.collection는 함수가 아닙니다 (0) | 2019.12.05 |
[MONGODB] 몽구스 / MongoDB를에 Multifield 인덱스 만들기 (0) | 2019.12.05 |
[MONGODB] MongoDB의 배열에 배열 쿼리 (0) | 2019.12.05 |
[MONGODB] 방법) (MongoDB의 네이티브 findOne의 필드 이름으로 변수를 사용하는 방법? (0) | 2019.12.05 |