Создание промежуточного программного обеспечения expressjs, которое принимает параметры
Я пытаюсь создать промежуточное программное обеспечение, которое может принимать параметры. Как это можно сделать?
Пример
app.get('/hasToBeAdmin', HasRole('Admin'), function(req,res){
})
HasRole = function(role, req, res, next){
if(role != user.role){
res.redirect('/NotInRole);
}
next();
}
Ответы
Ответ 1
function HasRole(role) {
return function(req, res, next) {
if (role !== req.user.role) res.redirect(...);
else next();
}
}
Я также хочу убедиться, что я не делаю несколько копий одной и той же функции:
function HasRole(role) {
return HasRole[role] || (HasRole[role] = function(req, res, next) {
if (role !== req.user.role) res.redirect(...);
else next();
})
}
Ответ 2
app.get('/hasToBeAdmin', (req, res, next) => {
hasRole(req, res, next, 'admin');
}, (req,res) => {
// regular route
});
const hasRole = (req, res, next, role) => {
if(role != user.role){
res.redirect('/NotInRole');
}
next();
};
Ответ 3
Альтернативно, если у вас слишком много случаев или если роль НЕ является строкой:
function HasRole(role) {
return function(req, res, next) {
if (role !== req.user.role) res.redirect(...);
else next();
})
}
var middlware_hasRoleAdmin = HasRole('admin'); //define router only once
app.get('/hasToBeAdmin', middlware_hasRoleAdmin, function(req,res){
})
Ответ 4
Если у вас есть разные уровни разрешений, вы можете их структурировать следующим образом:
const LEVELS = Object.freeze({
basic: 1,
pro: 2,
admin: 3
});
/**
* Check if user has the required permission level
*/
module.exports = (role) => {
return (req, res, next) => {
if (LEVELS[req.user.role] < LEVELS[role]) return res.status(401).end();
return next();
}
}