2016-03-12 89 views
2

Hej,有問題。嘗試發送快速響應與Mongo數據。
這是代碼從我的Express服務器Express Mongoose Model.find()返回undefined

var Task = require('./modules/Task'); 
app.get('/get-all-tasks',function(req,res){ 
    res.setHeader('Content-Type', 'application/json'); 
    console.log(Task.getAllTasks()); // returns undefined 
    res.json({msg:"Hej, this is a test"}); // returns object 
}); 


這是在單獨的文件

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/todo-app'); 

var TaskSchema = mongoose.Schema({ 
    name: String, 
    assignee: String 
},{ collection : 'task' }); 

var Task = module.exports = mongoose.model('Task', TaskSchema); 

module.exports.createTask = function (newTask, callback) { 
    newTask.save(callback); 

} 

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

貓鼬模型如何正確我從發送功能getAllTask​​s數據?

回答

1

我相信你需要做的是returngetAllTasks功能的文檔,但也許是一個更好的方式,異步使用回調,像這樣的事:

module.exports.getAllTasks = function(callback){ 
     Task.find().lean().exec(function (err, docs) { 

     // If there is an error, return the error and no results 
     if(err) return callback(err, null) 

     // No error, return the docs 
     callback(null, docs) 
    }); 
} 

然後你的路線,你會內這樣做:

app.get('/get-all-tasks',function(req,res){ 
    Task.getAllTasks(err, docs){ 

     if(err) return res.json(error: err) 
     res.json(msg: docs);  
    } 
}); 

我不知道,如果getAllTasks應該是mongoose static,在這種情況下,你的模型將看起來像這個:

TaskSchema.statics.getAllTasks = function (callback) { 
    return this.find().lean().exec(callback); 
} 
+0

謝謝你很多!!!!簡短,清晰和嚴格。現在我明白我的錯誤在哪裏 – lomboboo

+0

沒問題,很高興我能幫上忙。 –

0

這看起來是正確的,但你忘記了JavaScript的異步行爲:)。當你的代碼是:

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

你可以看到JSON響應,因爲你使用的是console.log指令中回調(你傳遞給.exec(匿名函數)) 但是,當你鍵入:

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將執行getAllTasks()功能不返回任何東西(不確定),因爲真正返回你想要的是裏面的回調數據的事......

所以,得到它的工作,你需要這樣的事情:

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

而且我們可以這樣寫:

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