gpt4 book ai didi

node.js - Express Mongoose Model.find() 返回未定义

转载 作者:可可西里 更新时间:2023-11-01 10:23:41 25 4
gpt4 key购买 nike

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

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


这是单独文件中的 Mongoose 模型

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 函数正确发送数据?

最佳答案

这看起来是正确的,但是您忘记了 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 将执行不返回任何内容(未定义)的 getAllTask​​s() 函数,因为真正返回您想要的数据的东西在回调内部...

因此,要使其正常工作,您需要这样的东西:

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

关于node.js - Express Mongoose Model.find() 返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35962539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com