如何从Mongoose Schema的find查询中依据匹配属性返回Boolean值
问题根因
- 你定义的
preferencesFlowCompleted虽然标记了async,但内部用了回调形式的findOne查询,回调函数中的返回值只会返回到回调本身,不会作为外层函数的返回值,因此函数执行后默认返回了Promise { undefined }。 - 你在路由中同步判断
preferencesFlowCompleted的返回值,Promise对象属于非空对象,在布尔判定中会被识别为true,因此访问限制直接失效。
解决方法
第一步:重写preferencesFlowCompleted方法
改用async/await写法处理数据库查询,确保函数能正确返回布尔类型的结果:
/** * Import schemas. */ const Preference = require('../models/preference'); async function preferencesFlowCompleted(req, next) { try { const preference = await Preference.findOne({ userId: req.session.userId }); // 可选链+双感叹号保证返回值为布尔类型 return !!preference?.completed; } catch (err) { next(err); return false; } }; module.exports = preferencesFlowCompleted;
第二步:修改首页路由逻辑
路由处理函数增加async标记,用await接收preferencesFlowCompleted的返回结果再做判断:
/** * Get home page. * @param {*} req * @param {*} res * @param {*} next */ exports.getHome = async (req, res, next) => { const flowCompleted = await preferencesFlowCompleted(req, next); if (flowCompleted) { res.status(202).render('home'); } else { res.redirect('/preferences'); } };
内容的提问来源于stack exchange,提问作者Sailor Studios
相关产品推荐
相关产品推荐

