[英]Why does my Async function only work correctly when I change my called functions syntax?
我花了几个小时试图使下面的异步请求正常工作,并且在学习了大量有关异步请求,猫鼬和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
然后,您的函数将返回未定义。 应该返回一个承诺为w交互/ await
正确
function usr() {
// return!
return Person.findOne({username: req.query.u}).exec()
}
如此多的问题...对于初学者而言,异步函数将返回值包装为Promise,因此您在handler()中实际返回的内容是未解决的Promise。
因此将function(req, res)
转换为异步版本并await handler()
或调用
handler().then(cb)
您还应该在猫鼬模型中坚持回调或Promise。 如果省略回调,则调用Model.find/delete/insert()
的返回结果通常是一个承诺。
我建议将代码重构为类似的东西。
router.get('/usercheck', async function(req, res) {
const { u:username, e:email } = req.query;
try {
const { username:u, email:e } = await Person.findOne({ username, email });
if(e && u) {
res.status(200) //Both available
}
else if (e && !u) {
res.status(409) //"Email free, user taken"
}
else if (!e && u) {
res.status(403) //"Email taken, user free"
}
else if (e!=null && u!=null) {
res.status(418)
}
} catch(e) {
res.status(500).json(e);
}
});
对于编写的代码的样式和清晰度,我有很多不满意的地方,但是在第二种情况下未获得结果的原因仅仅是因为您没有从usr()
和eml()
职能。 应该通过前缀来解决return
立即之前Person.findOne(...
线。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.