从 express js 中的路由调用函数对象
call function object from route in express 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 不在上述任何函数中,因此在提供 req、res 的情况下,假设 req 和 next 不是全局变量,它无法在其名称空间中找到 req。
例如:req 和 next 被传递给错误处理函数:
function clientErrorHandler(err, req, res, next) {
if (req.xhr) {
res.status(500).send({ error: 'Something blew up!' });
} else {
next(err);
}
}
然后 next 和 res 在范围内可用。
prepareRes 在 post 之外声明并获取处理程序,因此它无法访问 req(uest) 或 next。
最明显的解决方案是将 request 和 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签名。
我的代码看起来像这样:
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 不在上述任何函数中,因此在提供 req、res 的情况下,假设 req 和 next 不是全局变量,它无法在其名称空间中找到 req。
例如:req 和 next 被传递给错误处理函数:
function clientErrorHandler(err, req, res, next) {
if (req.xhr) {
res.status(500).send({ error: 'Something blew up!' });
} else {
next(err);
}
}
然后 next 和 res 在范围内可用。
prepareRes 在 post 之外声明并获取处理程序,因此它无法访问 req(uest) 或 next。
最明显的解决方案是将 request 和 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签名。