Me deparei com um trecho de código do Mongoose que incluía uma consulta findOne e uma função exec ().
Nunca vi esse método em Javascript antes? O que isso faz exatamente?
Me deparei com um trecho de código do Mongoose que incluía uma consulta findOne e uma função exec ().
Nunca vi esse método em Javascript antes? O que isso faz exatamente?
Respostas:
Basicamente, ao usar o mangusto, os documentos podem ser recuperados usando ajudantes. Todo método de modelo que aceita condições de consulta pode ser executado por meio de um callback
ou do exec
método.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Portanto, quando você não passa um retorno de chamada, você pode construir uma consulta e eventualmente executá-la.
Você pode encontrar informações adicionais nos documentos do mangusto .
ATUALIZAR
Algo a ser observado ao usar Promises em combinação com operações assíncronas do Mongoose é que as consultas do Mongoose não são Promises. As consultas retornam um thenable , mas se você precisa de uma promessa real, deve usar o exec
método. Mais informações podem ser encontradas aqui .
Durante a atualização, percebi que não respondi explicitamente à pergunta:
Nunca vi esse método em Javascript antes? O que isso faz exatamente?
Bem, não é um método nativo de JavaScript, mas parte da API Mongoose.
exec
método. Isso é o que eles fazem nos documentos, pelo menos. Para ter certeza, você pode verificar a si mesmo com Model.find() instanceof require('bluebird')
. Espero que isto ajude.
Model.update().exec()
ter certeza de que ele será executado. Então você pode responder à API sem esperar pela atualização.
Daniel respondeu a isso muito bem. Para elaborar uma lista exaustiva de maneiras de criar e executar consultas, observe os seguintes casos de uso:
Construção de consulta
O Mongoose não executará uma consulta até then
ou até exec
ser chamado. Isso é muito útil ao construir consultas complexas. Alguns exemplos podem incluir o uso das funções populate
e aggregate
.
User.find({name: 'John'}) // Will not execute
Execução via callback
Embora não sejam apreciadas por muitos devido à sua natureza de aninhamento, as consultas podem ser executadas fornecendo o retorno de chamada opcional.
User.find({name: 'John'}, (err, res) => {}) // Will execute
Então API as a Promises / A +
As consultas do Mongoose fornecem uma then
função. Isso não deve ser confundido com promessas regulares. Simplificando, a especificação Promises / A + requer uma then
função para funcionar da mesma forma que estamos acostumados com promessas.
User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel
A função exec
Da documentação da Mongoose If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise
then
em uma consulta para retornar uma promessa. Isso não é muito diferente de exec
. O caso de uso que considero útil é quando uso algo como Promise.all
. Não tenho certeza se a promessa retornada por exec
funciona em tais contextos embora.
exec()
retornará uma promessa se nenhum retorno de chamada for fornecido. Portanto, o seguinte padrão é muito conveniente e genérico - ele pode lidar bem com retornos de chamada ou promessas:
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);
}
Eu recomendo usar promessas do Bluebird com Mongoose, para fazer isso, use esta chamada:
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');