我有这个nodejs函数,用于将一些数据插入到db中,当它完成插入时,它应该返回' success'或者'失败'。
此功能位于 insert.js
文件中function insert (req,res) {
var d = req.body;
new dbModel({
name: d.dname,
desc: d.desc
}).save(false,function(err){
if (err){
return 'failure';
}else{
return 'success';
}
});
}
module.exports.insert = insert;
它将数据插入到数据库中,但它不会返回任何值。
这是调用上述功能的路线,它位于 routes.js文件中。
router.post('/insert', function(req, res) {
var result = insert.insert(req,res);
res.render('insert',{title: 'insert',message: result});
});
我做错了什么或者这与nodejs的异步性有关。
请帮忙。感谢。
修改 我尝试@Salehen Rahman在下面的答案中说,但页面没有呈现,浏览器一直等待来自服务器的回复,我试图在回调函数内记录结果的值,再次没有输出,似乎回调函数内的代码没有运行。我检查了数据库并且数据已成功插入。
答案 0 :(得分:1)
dbModel#save
方法是异步的,因此,return
关键字只会将返回 内部 anonymous function。您想要使用回调。同时从save方法中删除 false 。它只能将回调函数作为参数。
因此,您的insert
函数将如下所示:
function insert (req, res, callback) {
var d = req.body;
new dbModel({
name: d.dname,
desc: d.desc
}).save(function(err){
if (err){
// Instead of return, you call the callback
callback(null, 'failure');
}else{
// Instead of return, you call the callback
callback(null, 'success');
}
});
}
module.exports.insert = insert;
你的路线功能如下:
router.post('/insert', function(req, res) {
insert.insert(req, res, function (err, result) {
res.render('insert',{title: 'insert', message: result});
});
});
理想情况下,每当内部回调返回错误时,您也应该使用错误调用回调,而不会产生任何结果;如果没有错误,并且存在成功的函数调用,则将第一个参数设置为null,将第二个参数设置为结果。
通常,回调调用的第一个参数表示错误,而第二个参数表示结果。
作为参考,您可能需要阅读Node.js' callback pattern。