У вас есть две основные проблемы здесь.
Сначала async
возвращает AsyncFunction
, который возвращает Promise
при вызове. Это означает, что на данный момент ничего в getUser
не было выполнено. Мало того, что вы действительно должны вызвать getUser
, чтобы начать выполнение того, что находится внутри него, но вам также нужно дождаться результата, иначе у вас нет абсолютно никаких гарантий, что выполнение будет закончено.
Вместо того, чтобы преодолевать эту проблему, сделать вашу login
функцию async
более разумным выбором, поскольку вы пытаетесь выполнять внутри нее асинхронные операции. Затем вы можете удалить функцию getUser
и оставить только часть var result = await User.findOne(....)
.
Другая проблема, как сказали несколько человек в комментариях, заключается в том, что вам нужно await
на Promise
.
Глядя на ваш вызов функции, похоже, что ваши findOne
функции используют обратный вызов, а не обещание. Проверьте документацию, некоторые библиотеки поддерживают оба и могут действительно вернуть обещание, если вы не передадите какой-либо обратный вызов.
Если это произойдет, вы не должны передавать обратный вызов. Результат ожидаемого вызова должен быть userLogin
.
В противном случае, обернуть функцию так, чтобы она возвращала обещание, просто.
Основная схема выглядит следующим образом
// this is the function that we want to wrap
function funcToWrap(someParam, callback) {
// does stuff
callback(null, "some result");
}
// this is the wrapper
function wrappedFunction(someParam) {
return new Promise((resolve, reject) => {
funcToWrap(someParam, (err, res) => {
if (err === null) {
reject(err);
} else {
resolve(res);
}
});
});
Это преобразует вашу функцию на основе обратного вызова в функцию на основе обещаний. Тогда вы, конечно, можете await
на wrappedFunc
и использовать его как любое другое обещание.
Это настолько распространенный шаблон, что многие библиотеки уже реализуют эту функцию. Например, библиотека Promise Bluebird предоставляет функцию promisify
, которая делает именно это.
http://bluebirdjs.com/docs/api/promise.promisify.html
Таким образом, вместо того, чтобы писать все это самостоятельно, вы можете просто написать
var wrappedFunction = Promise.promisify(funcToWrap);