为两个集合配置Passport JWT策略的实现方案
如何让Passport JWT策略同时支持admins和users集合的查询?
我明白你的需求——现在你的Passport JWT策略只在users集合里查找用户,想让它同时能匹配admins集合里的账号对吧?这里有几种可行的实现方式:
方法1:依次查询两个集合
先查users集合,如果没找到目标用户,再去admins集合中查找。这种方式逻辑简单直观,适合两个集合不存在ID重叠的场景:
const jwtStrategy = new JwtStrategy(jwtOptions, (jwtPayload, done) => { console.log(jwtPayload); // 优先查询users集合 User.findById(jwtPayload.sub, (err, user) => { if (err) { return done(err, null); } if (user) { return done(null, user); } // users中未找到时,查询admins集合 Admin.findById(jwtPayload.sub, (err, admin) => { if (err) { return done(err, null); } // 找到管理员就返回,否则返回false表示认证失败 return done(null, admin || false); }); }); });
方法2:用Promise并行查询(更高效)
如果你的Mongoose版本支持Promise(目前主流版本都已支持),可以用Promise.all同时发起两个集合的查询请求,减少整体等待时间:
const jwtStrategy = new JwtStrategy(jwtOptions, async (jwtPayload, done) => { console.log(jwtPayload); try { // 并行查询users和admins集合 const [user, admin] = await Promise.all([ User.findById(jwtPayload.sub).exec(), Admin.findById(jwtPayload.sub).exec() ]); // 返回找到的用户/管理员,都没找到则返回false return done(null, user || admin || false); } catch (err) { // 捕获查询过程中的错误并返回 return done(err, null); } });
额外提醒
- 要确保
jwtPayload.sub是两个集合中文档的唯一ID,避免出现ID冲突导致匹配错误的情况。 - 如果后续还需要扩展更多用户类型(比如moderators),建议考虑抽象出一个基础用户模型,或者改用单集合加
userType字段的设计,这样后续维护会更便捷。
内容的提问来源于stack exchange,提问作者BT101
相关产品推荐
相关产品推荐

