抽象中间件功能

时间:2019-05-21 11:39:54

标签: javascript express

所以我发现我的中间件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-已经有三个参数了,不知道在哪里放置第四个参数。

1 个答案:

答案 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");