Я потратил пару часов, пытаясь заставить правильно работать приведенный ниже асинхронный запрос, и после изучения целой пачки асинхронных запросов, mongoose и 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();
});
Я уверен, что для этого есть логическая причина, но я ее не понимаю.Насколько я понимаю, оператор return в любой версии кода должен быть передан в метод resolv (), который должен его оценить.
Однако, со второй, оригинальной реализацией, ничто не передается для разрешения () вообще, цикл if else завершается неудачно, и отправляется ошибка 500 возврата;Может кто-нибудь помочь мне понять, почему?