【问题标题】:How to pass parameter to function in middleware如何将参数传递给中间件中的函数
【发布时间】:2019-04-16 19:01:18
【问题描述】:

所以我想将参数传递给中间件,但我在某些方面遇到了困难。

我在路由的处理程序中有这个功能:

router.get('/users', auth.required, userController.findAll);

然后它会转到调用getTokenFromHeaders的auth函数:

const auth = {
  required: jwt({
    secret: 'secret',
    userProperty: 'payload',
    getToken: getTokenFromHeaders,
  }),
   ...
};

getTokenFromHeaders函数中,获取token并检查,如下所示:

const getTokenFromHeaders = (req) => {
...
   return token; // Or null in case it's not there or incorrect

所以我的目标是传递一个像 auth.required('role') 这样的参数来检查用户在 getTokenFromHeaders 函数中的角色(定义更多的身份验证函数也可以(auth.admin,auth.whatever,...)

我已经尝试修改如下:

const auth = {
  required: jwt({
    secret: 'secret',
    userProperty: 'payload',
    getToken: getTokenFromHeaders(req, res, role),
  }),

但它说 req 和 res 没有定义。

有什么办法吗?

【问题讨论】:

  • 'role' 来自哪里?

标签: javascript node.js express


【解决方案1】:

get 方法接收路径和 2 个回调,其中第一个是中间件:

router.get('/users', auth, userController.findAll);

中间件类似于findAll函数,在之前执行:

var auth = function (req, res) {
    // Get token from header (http://expressjs.com/en/api.html#req.get)
    var token = req.get("myToken");

    // TODO Validate token:
    var isValid = someFunction(token);
    if (!isValid) {
        // ************
        // TODO Check if user can access this resource
        // ************
        res.json("not authorized");
    }

    // Go to findAll (next callback)
};

我建议你看看docs,特别是app.use,以更好地了解中间件在express中的工作原理。

【讨论】:

  • 谢谢!这有助于我实施解决方案并更好地理解中间件是如何工作的:D
【解决方案2】:

我认为:

1) 请求调用

app.use('/users', required);

2) 检查认证

const required = (req, res, next) => {
    const auth = {
        required: jwt({
            secret: 'secret',
            userProperty: 'payload',
            getToken: getTokenFromHeaders(req),
        }),
        ...
    };

    if (auth.required) next();
    else // error
}

3) 下一步

router.get('/users', userController.findAll);

4) userController.findAll

userController.findAll 将使用恢复的参数(req 和 res)发送响应

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-09
    • 2020-02-29
    • 1970-01-01
    • 2013-05-16
    • 2019-09-01
    • 2018-10-08
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多