无法在功能范围之外更改值

时间:2019-09-14 17:23:44

标签: node.js mongodb express

即使user.length大于零,重复变量也始终为false。控制台首先打印“ false”,然后打印重复记录。

var duplicate = false;
userModel.find({mobileNumber: 123456789},(err, user)=>{
    if(user.length > 0){
        console.log("Duplicate Record");
        duplicate = true;
    }
});
console.log(duplicate);

2 个答案:

答案 0 :(得分:1)

Node JS本质上是异步的,因此它将打印

console.log(duplicate);首先运行find函数

查看日志

var duplicate = false;
userModel.find({mobileNumber: 123456789},(err, user)=>{
    console.log('find function called');
    if(user.length > 0){
        console.log("Duplicate Record");
        duplicate = true;
        console.log('duplicate inside',duplicate);
    }
});
console.log('duplicate outside',duplicate);

答案 1 :(得分:0)

将重复项读取为false的原因是console.log的执行是在返回MongoDB查询(运行回调以更改重复项)之前完成的。

要解决这种竞争状况,Mongoose可以为查询返回Promise,您可以将async / await用于期望的同步行为。

async () => {
    var duplicate = false;
    let users = await userModel.find({mobileNumber: 123456789}).exec();

    if (users.length > 0) {
        console.log("Duplicate record");
        duplicate = true;
    }

    console.log(duplicate); // true

    // more code
}