You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:24:08