nodejs函数不返回值

时间:2014-09-21 15:54:52

标签: javascript node.js express

我有这个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在下面的答案中说,但页面没有呈现,浏览器一直等待来自服务器的回复,我试图在回调函数内记录结果的值,再次没有输出,似乎回调函数内的代码没有运行。我检查了数据库并且数据已成功插入。

1 个答案:

答案 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