node.js - 护照中间件不运行
问题描述
我正在使用 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 添加中间件?
如果您需要更多信息,请告诉我
解决方案
尝试将最后两次调用的顺序翻转到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()
.
推荐阅读
- pointers - Golang 中的 *uint 和 uintptr 有什么区别?
- sql - SQL选择列基于左连接后另一列的MIN值
- excel - 粗体 E 列中前 50% 的总和值及其行
- ios - 在 Firebase 实时数据库中存储数据
- javascript - 在 javascript 中传递两个 GET 变量
- kubernetes - 我可以在哪里动手学习 Kubernetes
- vue.js - 如何使另一个vue文件中的抽屉在单击时同步可见
- php - 当数据库中有相关数据时,Laravel Eloquent 'with' 和 'belongsTo' 关系返回 null
- python - 为什么我的循环会跳过 python 中的对象?
- azure-data-lake - 尽管捕获的消息指标与传入消息匹配,但捕获积压更高