[javascript] Mongoose-exec 함수는 무엇을합니까?

쿼리 findOne과 exec () 함수가 포함 된 Mongoose 코드를 발견했습니다.

이전에 Javascript에서 해당 방법을 본 적이 없습니까? 정확히 무엇을합니까?



답변

기본적으로 몽구스를 사용할 때 도우미를 사용하여 문서를 검색 할 수 있습니다. 쿼리 조건을 허용하는 모든 모델 메서드는 callback또는 exec메서드를 통해 실행할 수 있습니다 .

callback:

User.findOne({ name: 'daniel' }, function (err, user) {
  //
});

exec:

User
  .findOne({ name: 'daniel' })
  .exec(function (err, user) {
      //
  });

따라서 콜백을 전달하지 않으면 쿼리를 작성하고 결국 실행할 수 있습니다.

몽구스 문서 에서 추가 정보를 찾을 수 있습니다. .

최신 정보

Mongoose 비동기 작업과 함께 Promise 를 사용할 때 유의해야 할 점 은 Mongoose 쿼리가 Promise 가 아니라는 것 입니다. 쿼리는 thenable을 반환 하지만 실제 Promise 가 필요한 경우 exec메서드를 사용해야합니다 . 자세한 내용은 여기 에서 확인할 수 있습니다 .

업데이트하는 동안 질문에 명시 적으로 답변하지 않은 것으로 나타났습니다.

이전에 Javascript에서 해당 방법을 본 적이 없습니까? 정확히 무엇을합니까?

글쎄 그건 하지 네이티브 자바 스크립트 방법,하지만 몽구스 API의 일부.


답변

다니엘은 이에 대해 매우 아름답게 대답했습니다. 쿼리를 작성하고 실행하는 방법의 전체 목록을 자세히 설명하려면 다음 사용 사례를 살펴보십시오.

쿼리 작성

Mongoose는 then또는 exec호출 될 때까지 쿼리를 실행하지 않습니다 . 이것은 복잡한 쿼리를 작성할 때 매우 유용합니다. 몇 가지 예에는 populateaggregate함수 사용이 포함될 수 있습니다 .

User.find({name: 'John'}) // Will not execute

콜백을 통한 실행

중첩 특성으로 인해 많은 사람들이 싫어하지만 선택적 콜백을 제공하여 쿼리를 실행할 수 있습니다.

User.find({name: 'John'}, (err, res) => {}) // Will execute

그런 다음 약속 / A +로서의 API

몽구스 쿼리는 then기능을 제공 합니다. 이것은 일반적인 약속과 혼동해서는 안됩니다. 간단히 말해서 Promises / A + 사양에는 then우리가 promise를 사용하는 방식과 매우 유사하게 작동 하는 함수가 필요합니다 .

User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel

exec 함수

Mongoose 문서에서 If you need a fully-fledged promise, use the .exec() function.

User.find({name: 'John'}).exec(); // Will execute returning a promise


답변

exec()콜백이 제공되지 않으면 promise를 반환합니다. 따라서 다음 패턴은 매우 편리하고 일반적입니다. 콜백이나 약속을 멋지게 처리 할 수 ​​있습니다.

function findAll(query, populate, cb) {

  let q = Response.find(query);

  if (populate && populate.length > 0) {
    q = q.populate(populate);
  }

  // cb is optional, will return promise if cb == null
  return q.lean().exec(cb);

}

Mongoose와 함께 Bluebird promise를 사용하는 것이 좋습니다. 이렇게하려면 다음 호출을 사용하세요.

const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');


답변