我花了几个小时试图使下面的Async请求正常工作,并且在学习了大量有关Async请求,猫鼬和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;谁能帮我理解为什么?
答案 0 :(得分:1)
首先,您要么坚持承诺,要么回调。
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()
}
答案 1 :(得分:0)
这么多问题...对于初学者来说,异步函数将返回的值包装为promises,因此您在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);
}
});
答案 2 :(得分:0)
对于您编写的代码的样式和清晰度,我有很多不满意的地方,但是在第二种情况下没有得到结果的原因仅仅是因为您没有从{{1} }和usr()
函数。应该通过在eml()
行之前加前缀return
来解决此问题。