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 callbackou do execmé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 execmé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.
execmé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é thenou até execser chamado. Isso é muito útil ao construir consultas complexas. Alguns exemplos podem incluir o uso das funções populatee 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 thenfunção. Isso não deve ser confundido com promessas regulares. Simplificando, a especificação Promises / A + requer uma thenfunçã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
thenem 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 execfunciona 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');