sql >> Database >  >> NoSQL >> MongoDB

Express Mongoose Model.find() retourneert undefined

Dat ziet er goed uit, maar je vergeet het asynchrone gedrag van Javascript :). Als je dit codeert:

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

U kunt het json-antwoord zien omdat u een console.log . gebruikt instructie BINNEN de callback (de anonieme functie die u doorgeeft aan .exec()) Wanneer u echter typt:

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 zal getAllTasks() execute uitvoeren functie die niets retourneert (niet gedefinieerd) omdat het ding dat echt de gewenste gegevens retourneert, BINNEN de callback is...

Dus om het werkend te krijgen, heb je zoiets als dit nodig:

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
    });
}

En we kunnen schrijven:

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)
});


  1. MongoDB 3.2 authenticatie mislukt

  2. Hoe tel ik alle documenten in een verzameling en gebruik ik de inhoud in een controller, met MongoDB en Express.js?

  3. Proberen te vullen in mangoest alleen als ref niet null is - werkt niet

  4. JSONObject voor document