通过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在范围内可用。