如何解决mongoose异步造成的数据不同步?

最近在用mongoose写一些小demo,然后我在需要验证用户名的时候出现了一些问题,代码如下:

router.get('/', function (req, res, next) {
    var userSchema = mongoose.Schema({ //数据格式
        name: String,
        password: String
    })
    var userModel = mongoose.model('userModel', userSchema) //定义数据模型,相当于类
    var user = new userModel({ //指定数据
        name: req.query.name,
        password: req.query.password
    })

    var exist = false

    user.find(function (err, name) { //是否已经存在相同用户名
        if (err) {
            return console.error(err)
        }
        if (req.query.name === name) {
            exist = true
            return
        }
    })

    if (exist === false) { //不存在相同用户名则将用户数据存入数据库
        user.save(function (err, doc) {
            if (err) {
                console.log(`error:${err}`)
            } else {
                console.log(doc)
            }
        })
    }
})

我的想法是将注册界面的用户名发过来,在数据库中验证,如果不存在相同用户名则将新用户名存入数据库。
现在有个问题就是,mongoose是异步的,应该如何获取在进行数据库查找后的exist变量?望指教

阅读 4.5k
2 个回答

不需要exist这个变量。
方法一:在find的回调函数内判断

userModel.find({name: req.query.name}, function (err, _user) { //是否已经存在相同用户名
        if (err) {
            return console.error(err)
        }
        if (_user) { 
            // user存在
            return
        } else {
        // user不存在
            user.save(function (err, doc) {
                if (err) {
                    console.log(`error:${err}`)
                } else {
                    console.log(doc)
                }
            })
        }
    })

方法二: 利用promise

userModel.find({name: req.query.name})
    .then(function(_user){
        if(_user) {
         // user存在
            return
        } else {
        
        // user不存在
            user.save(function (err, doc) {
                if (err) {
                    console.log(`error:${err}`)
                } else {
                    console.log(doc)
                }
            })
        }
    })

可以将处理逻辑放在查询函数内,即查询后根据返回值处理是否存入数据库
也可以用callback回调函数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏