通过expression式js中的路由调用函数对象

我的代码看起来像这样:

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之外被声明并且得到处理程序,所以它不能访问req(uest)或者next。

最明显的解决scheme是将请求和下一个参数添加到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签名。

因为prepareRes不在上面的任何函数中,其中req,res被提供,所以它不能在它的命名空间中findreq,假设req和next不是全局的。

这里举个例子:req和next传递给一个error handling函数:

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

然后next和res在范围内可用。