【发布时间】:2018-04-18 20:45:33
【问题描述】:
请考虑到在 SO 上已经提出了类似的问题,我已经回答了其中的大部分问题。
我正在制作一个需要查询数据库以获取数据的 RESTful 服务。我编写了正确查询数据库但始终返回未定义的代码。代码在这里:
function returnAll(){
ModuleDBService.find({},function(err,data){
if(err){
console.log('Error occured while retrieving the documents!');
}
return data;
});
}
我正在使用以下方式导出模块:
module.exports = {
getAll:returnAll
};
在挖掘了很多之后,我发现我需要使用回调来获取数据。我浏览了许多示例并尝试将类似的技术应用于我的代码,修改后的代码如下所示:
function getAllFromDatabase(callback){
ModuleDBService.find({},function(err,data){
if(err){
console.log('Error occured while retrieving the documents!');
}
callback(returnAll(data));
});
}
function returnAll(data){ return data;}
然后以与上述类似的方式返回它。
但现在我收到 ModuleDAO.getAll 不是函数的错误(我正在使用 var ModuleDAO = require('path to the database service')。
我尝试了许多代码变体,浏览了 YouTube 上的几个视频,所有这些视频要么导致返回未定义,要么返回上述错误。如果有人可以修复代码并阐明整个回调的事情(或者可以提供可靠的文档来理解它),那将是一个很大的帮助。
谢谢。
编辑:在所有非常有用的答案之后,这里是一个摘要:
回调不能返回数据,请传递您希望程序使用数据调用的函数(回调函数)。就我而言,是我的路由器返回数据。
以下是更正后的代码:
function returnAll(callback) {
ModuleDBService.find({}, function (err, data) {
if (err) {
console.log("Error while retrieving the document!")
callback(null);
}
callback(data);
});
}
我在路由器中使用此代码:
mainAPIRouter.post('/api/module', function (req, res) {
try {
moduleDAO.getAll(function(data){
res.status(200);
res.json(data);
});
} catch (error) {
res.status(500);
return res.send("Invalid request");
}
});
感谢所有帮助过的人! :)
【问题讨论】:
-
对我来说,这似乎是一个 X/Y,实际上只是另一个副本:stackoverflow.com/questions/14220321/…
-
@KevinBHi!我知道存在类似的问题,并且我已经解决了大部分问题,只是我无法弄清楚为什么类似的解决方案会导致我的案例中出现未定义和错误。
-
什么是未定义的?
-
例如,returnAll 不返回任何内容,原因在我链接的副本中有所说明。如果那是未定义的,那么是的,这绝对是一个骗局。
-
它实际上是那个 bug @KevinB 的副本。
标签: javascript node.js callback