복붙노트

[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. ==============================

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

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

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

    4.내가 노드 기능에 반환으로 꽤 사용하는 기능을 가지고있다.

    내가 노드 기능에 반환으로 꽤 사용하는 기능을 가지고있다.

    function freturn (value, callback){
        if(callback){
            return callback(value); 
        }
        return value; 
    }; 
    

    그럼 난 서명 모두의 선택적 콜백 매개 변수가 있습니다.

  5. ==============================

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

    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);
    });
    
  7. from https://stackoverflow.com/questions/6180896/how-to-return-mongoose-results-from-the-find-method by cc-by-sa and MIT license