Wygląda to poprawnie, ale zapominasz o asynchronicznym zachowaniu JavaScriptu :). Kiedy kodujesz to:
module.exports.getAllTasks = function(){
Task.find().lean().exec(function (err, docs) {
console.log(docs); // returns json
});
}
Możesz zobaczyć odpowiedź json, ponieważ używasz console.log
instrukcja WEWNĄTRZ wywołania zwrotnego (funkcji anonimowej, którą przekazujesz do .exec())Jednak, gdy wpiszesz:
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
wykona getAllTasks()
funkcja, która niczego nie zwraca (niezdefiniowana), ponieważ rzecz, która naprawdę zwraca dane, których potrzebujesz, znajduje się WEWNĄTRZ wywołania zwrotnego...
Aby to zadziałało, będziesz potrzebować czegoś takiego:
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
});
}
A my możemy napisać:
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)
});