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

使用异步函数作为if判断条件的执行顺序异常问题

问题原因

你当前的代码存在两个核心问题:

  • 外层con函数没有主动定义返回值,默认返回undefined,所以if判断的条件永远是假值
  • User.findOne是异步任务,你写在回调函数里的return只会把值返回给回调函数本身,无法传递到外层的con函数。等异步任务执行完成返回结果时,if判断逻辑早就执行完毕了。
解决方案

方案1:回调函数写法

第一步:修改con.js代码,把异步结果通过回调传递

const User = require ('../nodeDB/models/user.js');

const con = function (email, callback) {
     User.findOne( { userEmail: email }, function (err, doc) {
       if(err) {
           console.log(err);
           return callback(err);
       }
       // 你原代码返回逻辑和调用判断逻辑冲突,这里已修正:用户存在返回true,不存在返回false
       callback(null, !!doc);
     });
}

module.exports.con = con;

第二步:调整调用逻辑,把判断写在回调里

const con = require('./con');

con.con('email@gmail.com', function(err, isUserExist) {
  if (isUserExist) {
    console.log('User exists!')
  } else {
    console.log('user does not exist?')
  }
})

方案2:async/await写法(更推荐,可读性更高)

Mongoose的查询方法本身支持Promise,可以用async/await简化异步逻辑:

第一步:修改con.js为async函数

const User = require ('../nodeDB/models/user.js');

const con = async function (email) {
  try {
    const doc = await User.findOne( { userEmail: email } );
    // 你原代码返回逻辑和调用判断逻辑冲突,这里已修正:用户存在返回true,不存在返回false
    return !!doc;
  } catch (err) {
    console.log(err);
    throw err;
  }
}

module.exports.con = con;

第二步:用await获取异步结果再做判断

const con = require('./con');

async function checkUser() {
  const isUserExist = await con.con('email@gmail.com');
  if(isUserExist) {
    console.log('User exists!')
  } else {
    console.log('user does not exist?')
  }
}

checkUser();

如果你要保留原代码「用户存在返回false、不存在返回true」的逻辑,自行翻转上述返回值即可

内容的提问来源于stack exchange,提问作者Serhat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:24:03