从快递js中的路由调用函数对象

时间:2015-01-01 16:42:19

标签: javascript node.js express

我的代码看起来像这样:

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

就我而言。

2 个答案:

答案 0 :(得分:1)

prepareRes在帖子之外声明并获取处理程序,因此它无法访问req(uest)或next。

最明显的解决方案是在prepareRes函数签名中添加request和next参数,然后在请求处理程序中调用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签名。

答案 1 :(得分:0)

由于prepareRes不在上述任何函数内部,其中提供了req,res,因此无法在其命名空间中找到req,假设req和next不是全局变量。

例如:req和next被传递给错误处理函数:

function clientErrorHandler(err, req, res, next) {
  if (req.xhr) {
    res.status(500).send({ error: 'Something blew up!' });
  } else {
    next(err);
  }
}

然后是下一个,范围内有res。