Javascript 节点中MongoClient的查询顺序正在更改执行顺序?
我试图构建一个注册api端点,并在该调用中使用Mongodb检查两件事: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
{“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}`)
};