所以我发现我的中间件Express函数有重复的代码。
第一个功能:
const isAdmin = async (req, res, next) => {
try {
const requestingUser = await knex('users')
.first('current_role')
.where('id','=',req.user.id)
requestingUser.current_role !== 'admin' ? res.sendStatus(403) : next()
} catch (error) {
res.send({error})
}
}
第二功能:
const isAdminOrRecruiter = async (req, res, next) => {
try {
const requestingUser = await knex('users')
.first('current_role')
.where('id','=',req.user.id)
const isNotAllowed = requestingUser.current_role !== 'admin' && requestingUser.current_role !== 'recruiter'
isNotAllowed ? res.sendStatus(403) : next()
} catch (error) {
res.send({error})
}
}
我的问题是我该如何制作一个像isAllowed(['admin])
这样的抽象函数,以便只有管理员可以通过或isAllowed(['admin','recruiter'])
才能通过,所以它只能允许管理员和招聘人员通过?
我遇到的具体问题是args-已经有三个参数了,不知道在哪里放置第四个参数。
答案 0 :(得分:1)
您可以利用高阶函数来导出当前函数。您将拥有一个接受角色列表并返回另一个函数的函数,该函数使用该角色列表来检查当前用户是否已分配给其中任何一个,如果允许,则进行访问:
const isRole = (...roles) => async (req, res, next) => {
try {
const requestingUser = await knex('users')
.first('current_role')
.where('id','=',req.user.id)
const isAllowed = roles.some(role => role == requestingUser.current_role);
isAllowed ? next() : res.sendStatus(403)
} catch (error) {
res.send({error})
}
}
const isAdmin = isRole("admin");
const isAdminOrRecruiter = isRole("admin", "recruiter");