我是 Node.JS 的新手,找不到解决方案。 我正在构建一个 Restful 服务来从 mongo 检索数据。
应用程序.js
var database = require('./database.js');
...
app.get('/metadata', function(req, res) {
console.log("GET: metadata");
res.send(database.getMetadata(null));
});
app.get('/metadata/:id', function(req, res) {
console.log("GET: metadata");
res.send(database.getMetadata(req.params.id));
});
...
数据库.js
exports.getMetadata = function (id) {
console.log('getting metada...')
if (id == null) {
return FolderInfo.find({}, null, null, function (err, metadatas) {
if (!err) {
console.log(metadatas);
return metadatas;
} else {
return console.log(err);
}
});
}
else {
return FolderInfo.findById(id, function (err, metadatas) {
if (!err) {
return metadatas;
} else {
return console.log(err);
}
});
}
}
我尝试过许多不同的方法。但总是得到这样的结果:
{
options: {
populate: { }
},
_conditions: { },
_updateArg: { },
op: "find"
}
但我的 console.log(metadatas); 行正在将结果打印到控制台。 我正在使用所有最新的软件包。 有人可以帮助我吗?
最佳答案
您不能真正将同步 return
与 findById
等异步函数混合使用,因为它违背了异步操作的基本性质:“现在退出,稍后完成。”
您必须调整 getMetadata
以接受可以在 findById
稍后完成 时调用的回调函数:
exports.getMetadata = function (id, callback) {
// ...
};
并且,不是仅在没有 err
时才返回 metadatas
:
if (!err) {
return metadatas;
} else {
// ...
}
无论哪种情况,您都需要调用回调
:
callback(err, err ? null : metadatas);
在上下文中,这可能是:
FolderInfo.find({}, null, null, function (err, metadatas) {
if (err) {
console.log(err);
} else {
console.log(metadatas);
}
callback(err, err ? null : metadatas);
});
或者可能只是:
FolderInfo.find({}, null, null, callback);
然后传递给getMetadata
一个回调函数,在调用时处理响应:
app.get('/metadata', function(req, res) {
console.log("GET: metadata");
database.getMetadata(null, function (err, data) {
res.send(data);
});
});
关于Node.js:无法返回 Mongoose 查找结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12220621/