your programing

찾기 방법에서 Mongoose 결과를 반환하는 방법은 무엇입니까?

lovepro 2023. 5. 22. 23:15
반응형

찾기 방법에서 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.usersmongoose에 의해 데이터베이스에서 발견된 사용자
  • 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

반응형