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