IT박스

find 메서드에서 Mongoose 결과를 반환하는 방법은 무엇입니까?

itboxs 2021. 1. 7. 07:48
반응형

find 메서드에서 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 및 그 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);

모든 몽구스 (및 해당 모델) 메서드를 Async접미사 ( .exec()가됩니다 .execAsync()등)와 함께 프라 미스를 반환하는 함수로 사용할 수 있도록합니다. .promisifyAll()메소드는 Node.JS 세계에서 거의 보편적입니다. 콜백을 마지막 인수로받는 비동기 함수를 제공하는 모든 것에 사용할 수 있습니다.

Promise.props({
    users: users.find().execAsync(),
    articles: articles.find().execAsync()
  })

.props()bluebird 메서드는 프라 미스를 속성으로 가진 객체를 취하고 두 데이터베이스 쿼리 (여기서는 프라 미스)가 결과를 반환 할 때 해결되는 집합 적 프라 미스를 반환합니다. 해결 된 값은 results최종 함수 객체입니다.

  • results.users -몽구스가 데이터베이스에서 찾은 사용자
  • results.articles -mongoose가 데이터베이스에서 찾은 기사 (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에서 비동기식입니다. 몽구스의 발견도 마찬가지입니다. 그리고 직렬로 호출하려면 슬라이드 라이브러리 와 같은 것을 사용해야합니다 .

그러나 귀하의 경우 가장 쉬운 방법은 콜백을 중첩하거나 (이전에 선택한 사용자에 대한 기사를 열 수 있음) 비동기 라이브러리의 도움으로 완전히 병렬로 수행하는 것입니다 ( 흐름 제어 / 비동기 장점 참조 ).


I have a function that I use quite a bit as a return to Node functions.

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

Then I have an optional callback parameter in all of the signatures.


I was dealing with a very similar thing but using socket.io and DB access from a client. My find was throwing the contents of my DB back to the client before the database had a chance to get the data... So for what it's worth I will share my findings here:

My function for retrieving the DB:

//Read Boards - complete 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());
    };

My socket event listener:

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);
        });
    });

So to solve the problem we use the promise that mongoose gives us and then once we have received the data from the DB my socket emits it back to the client...

For what its worth...


You achieve the desired result by the following code. Hope this will help you.

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);
});

ReferenceURL : https://stackoverflow.com/questions/6180896/how-to-return-mongoose-results-from-the-find-method

반응형