Javascript 节点中MongoClient的查询顺序正在更改执行顺序?

Javascript 节点中MongoClient的查询顺序正在更改执行顺序?,javascript,node.js,mongodb,express,mongodb-query,Javascript,Node.js,Mongodb,Express,Mongodb Query,我试图构建一个注册api端点,并在该调用中使用Mongodb检查两件事: 如果传入的用户名已存在于数据库中,则发送状态500 如果传入的电子邮件已存在于数据库中,则发送状态500 如果没有触发这些条件,则插入:{“username”:“foo”,“email”:x@bar.com“,”密码“:“123456”} 这是我正在使用的端点: const client = new MongoClient(url, { useUnifiedTopology: true }); router.use(exp

我试图构建一个注册api端点,并在该调用中使用Mongodb检查两件事:

  • 如果传入的用户名已存在于数据库中,则发送状态500
  • 如果传入的电子邮件已存在于数据库中,则发送状态500
  • 如果没有触发这些条件,则插入:
    {“username”:“foo”,“email”:x@bar.com“,”密码“:“123456”}

    这是我正在使用的端点:

    const client = new MongoClient(url, { useUnifiedTopology: true });
    router.use(express.json());
    router.post('/register', (req, res, next)=>{
        client.connect(async function(err, client) {
            let db = client.db(dbName);
            let users = 'users';
            var status = 0;
            await db.collection(users).findOne({'username': req.body.username}, (err, result) =>{
                if(err) throw err;
                if(result){
                    status = 1;
                    console.log(status)
                    console.log(`username exists!: ${result}`)
                };
            });
            
            await db.collection(users).findOne({'email': req.body.email},(err, result) =>{
                if(err) throw err;
                
                if(result){
                    status = 2;
                    console.log(status)
                    console.log(`email exists!: ${result}`)
                };
            });
    
            //catch any errors thrown from the DB
            await db.collection(users).insertOne(
                {'username': req.body.username, 'email': req.body.email, 'password': req.body.password}, (err, result)=>{
                    if(err) throw err;
            });
            
            console.log(`status: ${status}`);
            if(status == 1){
                res.status(500).send('username exists')
            } else if(status == 2) {
                res.status(500).send('email exists');
            } else {
                res.status(201).send('User created!');
            }
    
            
        });
    });
    
    我得到的结果是:

    status: 0
    1
    username exists!: [object Object]
    2
    email exists!: [object Object]
    
    这让我很困惑,因为它似乎在查找完成之前就完成了插入?
    (我想知道为什么打印时打印结果是
    [object object]

    您混合了异步样式,这就是导致问题的原因。在旧版本的节点中,使用了回调样式。当承诺成为一个标准特性时,许多库更新了它们的代码,当且仅当回调没有传递给函数时才返回承诺

    如果您查看文档中的find-one,您将看到

    Returns:
    Promise if no callback passed 
    
    因此,您需要正确使用回调并将调用嵌套在回调中,或者删除回调参数并使用Promissions+async/await proeprly

    例如,使用异步等待+承诺值

    const result=wait db.collection(users.findOne({'username':req.body.username});
    如果(结果){
    状态=1;
    console.log(状态)
    log(`username exists!:${result}`)
    };
    
    您正在混合异步样式,这正是导致问题的原因。在旧版本的节点中,使用了回调样式。当承诺成为一个标准特性时,许多库更新了它们的代码,当且仅当回调没有传递给函数时才返回承诺

    如果您查看文档中的find-one,您将看到

    Returns:
    Promise if no callback passed 
    
    因此,您需要正确使用回调并将调用嵌套在回调中,或者删除回调参数并使用Promissions+async/await proeprly

    例如,使用异步等待+承诺值

    const result=wait db.collection(users.findOne({'username':req.body.username});
    如果(结果){
    状态=1;
    console.log(状态)
    log(`username exists!:${result}`)
    };