Express Mongoose Model.find()返回undefined

时间:2016-03-12 19:51:35

标签: node.js mongodb express mongoose

Hej,有问题。尝试使用Mongo数据发送Express响应。
这是我的Express服务器的代码

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


这是单独文件中的猫鼬模型

public void insertQ(SinglyLinkedListNode Q){
    if (prev.next.next == curr){
        prev.next = Q;
        Q.next = curr;
    }
    return;
}

如何从getAllTask​​s函数正确发送数据?

2 个答案:

答案 0 :(得分:1)

我相信您需要做的是return getAllTasks函数中的文档,但也许是使用回调函数异步执行此操作的更好方法:

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

答案 1 :(得分:1)

这看起来是正确的,但你忘记了Javascript的异步行为:)。当你编码时:

module Flattener
  def deep_flatten
    flatten.map do |item|
      case item
      when Hash, Array
        item.deep_flatten
      else
        item
      end
    end.flatten
  end
end

class Hash

  include Flattener

end

class Array

  include Flattener

end

您可以看到json响应,因为您在回调中使用module.exports.getAllTasks = function(){ Task.find().lean().exec(function (err, docs) { console.log(docs); // returns json }); } 指令(您传递给.exec()的匿名函数) 但是,当您键入:

console.log

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函数(未定义),因为真正返回所需数据的内容是INSIDE回调...

所以,为了让它起作用,你需要这样的东西:

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