如何将参数传递给中间件功能

时间:2019-04-16 10:30:42

标签: javascript node.js express

所以我想将参数传递给中间件,但是我在某些方面苦苦挣扎。

我在路由的处理程序中具有该功能:

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

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

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

getTokenFromHeaders函数中,令牌被检索并检查,如下所示:

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

因此,我的目标是传递一个类似auth.required('role')的参数来检查getTokenFromHeaders函数内部的用户角色(定义更多auth函数也可以(例如auth.admin,auth。 ...)

我已经尝试将其修改为以下内容:

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

但是它说req和res没有定义。

有什么办法吗?

2 个答案:

答案 0 :(得分:0)

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

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)
};

我建议您特别在docsapp.use中查看一下,以更好地理解中间件在express中的工作方式。

答案 1 :(得分:0)

我认为:

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将发送带有已恢复参数(要求和要求)的响应