代码之家  ›  专栏  ›  技术社区  ›  Normal

在expressjs中导入请求

  •  1
  • Normal  · 技术社区  · 1 年前

    我正在代码中创建一个助手方法,可以用来授权用户,

    我正在创建一个名为的函数 "usePermissions" 遵循反应方式,但在后端。

    这个 usePermissions() 将基于一些x、y和z返回true或false。

    但是这种方法取决于请求对象,

    所以为了让它发挥作用,我必须到处打电话 usePermissions(req) , 前-

    import usePermissions from 'hooks/usePermissions'
    
    usersRouter.delete('/users/:userId', async (req, res, next)=>{
      const { verify } = usePermissions(req)
      if(verify('deleteUsers')) await UserModel.delete(req.params.userId)
      // ...
    })
    

    有办法包装这个吗 “使用权限” 带有请求对象的helper方法?

    我希望它自动拥有请求对象,我不想一直将其作为变量传递,

    如何使它拥有请求对象,而不必将其作为参数传递给它,这可能吗?

    前-

    import usePermissions from 'hooks/usePermissions'
    
    usersRouter.delete('/users/:userId', async (req, res, next)=>{
      const { verify } = usePermissions() // <-- see, I want to not pass the req object
      if(verify('deleteUsers')) await UserModel.delete(req.params.userId)
      // ...
    })
    
    2 回复  |  直到 1 年前
        1
  •  1
  •   TBA    1 年前

    您可以创建一个中间件,该中间件将调用 usePermissions 并将结果附加到Request对象,这样它将在所有处理程序中都可用,而无需显式调用它。

    您的中间件代码可能看起来像(阅读更多关于使用 middlewares 在Express应用程序中)

    export function getUsePermissions = (req, res, next) => {
      const { verify } = usePermissions(req);
      req['verify'] = verify
    
      // moving to the next middleware in chain, now Request object has a verify property
      return next()
    }
    
    

    在您的快递应用程序中,添加 getUsePermissions 中间件

    express.use(getUsePermissions);
    

    现在您可以使用extract 使用权限 来自处理程序中的请求对象:

    usersRouter.delete('/users/:userId', async (req, res, next)=>{
      const { verify } = req['verify'];
      if(verify('deleteUsers')) await UserModel.delete(req.params.userId)
      // ...
    })
    
        2
  •  0
  •   Apoorva Chikara    1 年前

    是的,您可以将其用作中间件,默认情况下您将获得一个响应、请求和下一个对象。

    import usePermissions from 'hooks/usePermissions'
    
    usersRouter.delete('/users/:userId', usePermissions , async (req, res, next)=>{
      if(verify('deleteUsers')) await UserModel.delete(req.params.userId)
      // ...
    })
    

    usePermissions函数如下所示:

    const usePermissions = (request, response, next) => {
    
          const isPermitted = 'you logic';
          if (isPermitted) {
              next(); // this will automatically call the next middleware 
                      // in your case it will call the next callback in the userRouter
          } else {
             response.send('You don't have permission'); // just added a sample text for brevity
          }
          
    }
    
    

    你可以阅读更多关于 middlewares 在这里