我的代码如下所示:

router.route('/user')
.post(function(req, res, next){

 queryDB(arg1, arg2, prepareRes)

})
.get(function(req, res, next){

queryDB(arg3, arg4, prepareRes)

});

var prepareRes = function(err, data){

    if(err) next(err);
    else{
        req.data = data;
    }
};


当我运行此代码时,出现以下错误:

ReferenceError: next is not defined


要么

ReferenceError: req is not defined


发生这种情况是因为req和next不在prepareRes范围内。

如何解决这个错误?

我不想在两条路由中都重复相同的代码行,并且无法使用

route.all


就我而言。

最佳答案

prepareRes在post和get处理程序外部声明,因此它无权访问req(uest)或next。

最明显的解决方案是将请求和下一个参数添加到prepareRes函数签名,然后在请求处理程序中调用prepareRes时,将调用包装在可以访问它们的匿名函数中:

router.route('/user')
.post(function(req, res, next){

    queryDB(arg1, arg2, function(err, data){

        prepareRes(err,data, req, next);
    })

})
.get(function(req, res, next){

    queryDB(arg3, arg4, function(err, data){

        prepareRes(err,data, req, next);
    })

});

var prepareRes = function(err, data, req, next){

if(err) next(err);
else{
    req.data = data;
}
};


使用lodash之类的东西,您可以摆脱匿名函数,并部分地应用附加参数,如下所示:

queryDB(arg1, arg2, _.partialRight(prepareRes, res, next));


但是您仍然必须更改prepareRes签名。

关于javascript - 在Express JS中从路由调用函数对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27732623/

10-09 21:01