我花了几个小时试图使下面的异步请求正常工作,并且在学习了大量有关异步请求,猫鼬和node.js的知识之后,事实证明我的问题或多或少是一个语法问题(因为我可以理解)。
谁能告诉我为什么此代码有效,但我的原始代码却无效?
工作代码:
router.get('/usercheck', function(req, res) {
var usr = Person.findOne({username: req.query.u}, function(err, user){
if(user != null){
return user
}else return null
})
var eml = Person.findOne({email: req.query.e}, function(err, user){
if(user != null) {
return user
}else return null
});
var resolve = function(e, u){
if(e === null && u === null) res.sendStatus(200) //Both available
else if (e === null && u != null) res.sendStatus(409) //"Email free, user taken"
else if (e != null && u === null) res.sendStatus(403) //"Email taken, user free"
else if (e!=null && u!=null) res.sendStatus(418) //"Email and user taken"
else res.sendStatus(500) // Something broke, no idea what
}
async function handler() {
const user = await usr;
const email = await eml;
return resolve(email, user);
}
handler();
});
原始代码:
router.get('/usercheck', function(req, res) {
function usr() {
Person.findOne({username: req.query.u}, function(err, user){
if(user != null){
return user
}else return null
})
}
function eml(){
Person.findOne({email: req.query.e}, function(err, user){
if(user != null) {
return user
}else return null
});
}
var resolve = function(e, u){
if(e === null && u === null) res.sendStatus(200) //Both available
else if (e === null && u != null) res.sendStatus(409) //"Email free, user taken"
else if (e != null && u === null) res.sendStatus(403) //"Email taken, user free"
else if (e!=null && u!=null) res.sendStatus(418) //"Email and user taken"
else res.sendStatus(500) // Something broke, no idea what
}
async function handler() {
const user = await usr();
const email = await eml();
return resolve(email, user);
}
handler();
});
我敢肯定这是有逻辑的,但是我对atm并不了解。就我的理解而言,两种版本的代码中的return语句都应传递给resolve(),后者应对其进行评估。
但是,使用第二个原始实现,根本没有任何东西传递给resolve(),if else循环失败,并发送回退错误500;谁能帮我理解为什么?
首先,您要么坚持承诺,要么回调。
var usr = Person.findOne({username: req.query.u}).exec() // do not need a nodeback
然后,您的函数将返回未定义。应该返回与await
正确互动的承诺
function usr() {
// return!
return Person.findOne({username: req.query.u}).exec()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句