以快速路线处理所有中间件
Processing all middleware in an express route
我正在使用 express 构建一个 API 并且我在我的路由中使用了多个中间件。以下是我的端点之一
Router.route('/:id/documents')
.get([isAuthenticated, isAdmin || isUserOwn], Users.getUserDocuments);
下面是我的中间件:
export const isAdmin = (req, res, next) => {
if (req.decoded.role === 1) {
next();
} else {
res.status(401).send({
status: 'error',
message: 'Only admins are authorized to access this resource',
});
}
};
export const isUserOwn = (req, res, next) => {
if (req.decoded.userId === parseInt(req.params.id, 10)) {
next();
} else {
res.status(401).send({
status: 'error',
message: 'Only the owner can access this resource',
});
}
};
我只希望文档的所有者和管理员有权访问该文档。我现在遇到的问题是,如果用户不是管理员,它会发送 isAdmin 响应,而无需访问 isUserOwn 中间件。我实际上考虑过将两者都转换成一个中间件,但我也在其他路线上单独使用它们。我怎样才能同时达到 运行?
function isAdminOrisUserOwn(req,res,next){
if(req.decoded.userId === parseInt(req.params.id, 10) || req.decoded.role === 1){
next();
}else{
//error
}
}
函数通常是真实的,所以
func1 || func2
等于
func1
解决方案可能是像上面那样的额外功能,或者非常复杂的方法:
app.use(function(req,res,next){
isAdmin(req,{
status(code){
isUserOwn(req,res,next);
return this;
},
send(){}
},next);
也许最优雅的方法是一些包装函数,例如:
function every(...funcs){
return function(req,res,next){
var every=false;
funcs.reduce(function(func,middle){
return function(){
middle(req,res,func);
}
},_=>every=true);
if(every) next() else res.error(404);
};
}
function some(...funcs){
return function(req,res,next){
var some=false;
if(funcs.some(function(middle){
middle(req,res,_=>some=true);
return some;
}
})) next() else res.error(404);
};
}
所以你可以这样做:
app.use(some(isAdmin,isUserOwn),...);
我正在使用 express 构建一个 API 并且我在我的路由中使用了多个中间件。以下是我的端点之一
Router.route('/:id/documents')
.get([isAuthenticated, isAdmin || isUserOwn], Users.getUserDocuments);
下面是我的中间件:
export const isAdmin = (req, res, next) => {
if (req.decoded.role === 1) {
next();
} else {
res.status(401).send({
status: 'error',
message: 'Only admins are authorized to access this resource',
});
}
};
export const isUserOwn = (req, res, next) => {
if (req.decoded.userId === parseInt(req.params.id, 10)) {
next();
} else {
res.status(401).send({
status: 'error',
message: 'Only the owner can access this resource',
});
}
};
我只希望文档的所有者和管理员有权访问该文档。我现在遇到的问题是,如果用户不是管理员,它会发送 isAdmin 响应,而无需访问 isUserOwn 中间件。我实际上考虑过将两者都转换成一个中间件,但我也在其他路线上单独使用它们。我怎样才能同时达到 运行?
function isAdminOrisUserOwn(req,res,next){
if(req.decoded.userId === parseInt(req.params.id, 10) || req.decoded.role === 1){
next();
}else{
//error
}
}
函数通常是真实的,所以
func1 || func2
等于
func1
解决方案可能是像上面那样的额外功能,或者非常复杂的方法:
app.use(function(req,res,next){
isAdmin(req,{
status(code){
isUserOwn(req,res,next);
return this;
},
send(){}
},next);
也许最优雅的方法是一些包装函数,例如:
function every(...funcs){
return function(req,res,next){
var every=false;
funcs.reduce(function(func,middle){
return function(){
middle(req,res,func);
}
},_=>every=true);
if(every) next() else res.error(404);
};
}
function some(...funcs){
return function(req,res,next){
var some=false;
if(funcs.some(function(middle){
middle(req,res,_=>some=true);
return some;
}
})) next() else res.error(404);
};
}
所以你可以这样做:
app.use(some(isAdmin,isUserOwn),...);