首页 > 解决方案 > 护照中间件不运行

问题描述

我正在使用 passportJS 进行身份验证。我在 app.js 中调用了一个函数 setAuthenticatedUser

app.use(passport.initialize());
app.use(passport.session());
app.use('/', require('./routes'));
app.use(passport.setAuthenticatedUser);

这是我在文件 ./config/passport-local.js 中的中间件

passport.setAuthenticatedUser = async function (req, res, next) {
    if (await req.isAuthenticated()) {
        // req.user contains the current signed in user from the session cookie and we are just sending this to the locals for the views
        res.locals.user = req.user;
        // console.log('Locals\' user loaded');
    }
    next();
}

没有错误,但是在 app.js 中调用后 setAuthenticatedUser 没有运行。相反,我必须从每个路由手动调用中间件

router.get('/', passport.setAuthenticatedUser, homeController.home);
router.get('/route1', passport.setAuthenticatedUser,homeController.route1);
router.get('/route2', passport.setAuthenticatedUser, homeController.route2);
router.get('/route3', passport.setAuthenticatedUser, homeController.route3);
router.get('/route4', passport.setAuthenticatedUser, homeController.route4);

将来我会添加更多的路线。我该怎么做才能不必为每个 get req 添加中间件?

如果您需要更多信息,请告诉我

标签: node.jsexpressmongoosepassport.jsejs

解决方案


尝试将最后两次调用的顺序翻转到app.use. Express 将按照定义的顺序调用这些函数。

I'm assuming your routes defined in ./routes don't call next(), so there's no way for the next set of middlewares (in this case passport.setAuthenticatedUser) to run. So make sure that this call to the Passport function happens before your route handler, or more generally, before any function that won't call next().


推荐阅读