Điều đó có vẻ đúng, nhưng bạn đang quên về hành vi không đồng bộ của Javascript :). Khi bạn viết mã này:
module.exports.getAllTasks = function(){
Task.find().lean().exec(function (err, docs) {
console.log(docs); // returns json
});
}
Bạn có thể thấy phản hồi json vì bạn đang sử dụng console.log
hướng dẫn BÊN TRONG cuộc gọi lại (hàm ẩn danh mà bạn chuyển đến .exec ()) Tuy nhiên, khi bạn nhập:
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
sẽ thực thi getAllTasks()
hàm không trả về bất kỳ thứ gì (không xác định) bởi vì thứ thực sự trả về dữ liệu mà bạn muốn là BÊN TRONG lệnh gọi lại ...
Vì vậy, để nó hoạt động, bạn sẽ cần một cái gì đó như sau:
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
});
}
Và chúng ta có thể viết:
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)
});