sql >> Base de Datos >  >> NoSQL >> MongoDB

Express Mongoose Model.find() devuelve indefinido

Eso parece correcto, pero te estás olvidando del comportamiento asíncrono de Javascript :). Cuando codificas esto:

module.exports.getAllTasks = function(){
        Task.find().lean().exec(function (err, docs) {
        console.log(docs); // returns json
    });
}

Puede ver la respuesta json porque está utilizando un console.log instrucción DENTRO de la devolución de llamada (la función anónima que pasa a .exec()) Sin embargo, cuando escribe:

app.get('/get-all-tasks',function(req,res){
    res.setHeader('Content-Type', 'application/json');
    console.log(Task.getAllTasks()); //<-- You won't see any data returned
    res.json({msg:"Hej, this is a test"}); // returns object
});

Console.log ejecutará getAllTasks() función que no devuelve nada (indefinido) porque lo que realmente devuelve los datos que desea está DENTRO de la devolución de llamada...

Entonces, para que funcione, necesitarás algo como esto:

module.exports.getAllTasks = function(callback){ // we will pass a function :)
        Task.find().lean().exec(function (err, docs) {
        console.log(docs); // returns json
        callback(docs); // <-- call the function passed as parameter
    });
}

Y el podemos escribir:

app.get('/get-all-tasks',function(req,res){
    res.setHeader('Content-Type', 'application/json');
    Task.getAllTasks(function(docs) {console.log(docs)}); // now this will execute, and when the Task.find().lean().exec(function (err, docs){...} ends it will call the console.log instruction
    res.json({msg:"Hej, this is a test"}); // this will be executed BEFORE getAllTasks() ends ;P (because getAllTasks() is asynchronous and will take time to complete)
});