Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在express路由器和中间件之间传递数据_Javascript_Node.js_Express - Fatal编程技术网

Javascript 在express路由器和中间件之间传递数据

Javascript 在express路由器和中间件之间传递数据,javascript,node.js,express,Javascript,Node.js,Express,我试图编写express中间件来检查授权头中JWT的有效性。这似乎很简单,但我不希望它在所有路由上运行(例如,不在登录/注册路由器上) 因此,我想在路由器声明中指定一条路由应该需要一个有效的令牌。像这样的东西 const controllers = require('../controllers'); module.exports = (app) => { app.post('/auth/signup', controllers.auth.signup.post); a

我试图编写express中间件来检查授权头中JWT的有效性。这似乎很简单,但我不希望它在所有路由上运行(例如,不在登录/注册路由器上)

因此,我想在路由器声明中指定一条路由应该需要一个有效的令牌。像这样的东西

const controllers = require('../controllers');

module.exports = (app) => {

    app.post('/auth/signup', controllers.auth.signup.post);
    app.post('/auth/login', controllers.auth.login.post);

    app.get('/teams', controllers.teams.get, {requiresToken:true});

};
app.use(middleware({'data' : 'Test'}));

除此之外,.post和.get不接受第三个参数,控制器只接受(req、res、next)参数,因此我看不到为每个路由传递startic数据的方法。我肯定我缺少了一些简单的东西

这就是我如何创建一个中间件来将数据传递到

module.exports = function(options) {
   return function (req, res, next) {
        //write your code here
        // here you can access options variable
        console.log(options.data)
        next();
   }
}
您如何称呼中间件是这样的

const controllers = require('../controllers');

module.exports = (app) => {

    app.post('/auth/signup', controllers.auth.signup.post);
    app.post('/auth/login', controllers.auth.login.post);

    app.get('/teams', controllers.teams.get, {requiresToken:true});

};
app.use(middleware({'data' : 'Test'}));
按路线使用

app.post('/userRegistration', middleware({'data' : 'Test'}), (req, res) => {});

您可以使用负查找regexp从该中间件中排除
auth
子例程:

const controllers = require('../controllers');

module.exports = (app) => {

    app.use(/\/((?!auth).)*/, yourJwtTokenValidatorMethod); // replace with your jwt token validator middleware

    app.post('/auth/signup', controllers.auth.signup.post);
    app.post('/auth/login', controllers.auth.login.post);

    app.get('/teams', controllers.teams.get, {requiresToken:true});

};

除非我遗漏了什么,否则在实例化中间件时,您可以一次性将数据传递到中间件。不是,每一条路径在实例化路由时?Hi @ JunHoBBS,我更新了答案,添加了<代码>路由基础中间件谢谢,我不完全明白中间件是如何在中间调用一个“AUTH”函数的情况下被明确调用的,但您的回答告诉我,对于每个路由,可以将多个函数链接在一起,这样我就可以为每个路由调用一个auth函数,从外观上看,根本不使用中间件。