await
может использоваться только ВНУТРИ функции, которая объявлена с ключевым словом async
.
async function doSomething() {
let result = await someMongoooseFunctionThatReturnsAPromise();
// use result here
}
await
не может использоваться вне функции async
.Это то, что ваша ошибка говорит вам, и это никак не связано с мангустом.Это связано со структурой ВАШЕГО кода, который вызывает функцию mongoose.
ПРИМЕЧАНИЕ: Любой управляемый событиями код node.js УЖЕ находится внутри функции, поэтому для использования await
вдля этой функции все, что вам нужно сделать, это добавить ключевое слово async
к определению функции.Если вызывающая сторона этой функции не ожидает какого-либо возвращаемого результата, дальнейшие изменения не требуются.Если вызывающая сторона этой функции ожидает возвращаемого результата, вы должны адаптировать вызывающий код для ожидания возврата обещания из объявленной функции async
.
Также стоит понять, чтоasync
функция ВСЕГДА возвращает обещание.Хотя вы можете написать его как обычный последовательный код:
async function doSomething() {
let result = await someMongoooseFunctionThatReturnsAPromise();
// use result here
result++;
return result;
}
Эта функция фактически возвращает обещание, и разрешенное значение этого обещания будет возвращаемым значением функции.Поэтому, когда вы используете async
функцию, подобную этой, вы должны использовать возвращаемое обещание:
doSomething().then(finalResult => {
console.log(finalResult);
});
Итак, в вашем конкретном коде, если вы собираетесь использовать await
, он должен быть внутри функции async
:
async function someFunc() {
const result = await User.findOne({email: email}).exec();
// now this will work and you can use result here
}
В качестве альтернативы вы можете использовать .then()
вместо:
User.findOne({email: email}).exec().then(result => {
// process result here
// continue with other code that uses result here
});
ПРИМЕЧАНИЕ. Для обработки ошибок при использованииasync/await
, у вас есть два варианта:
Вы можете использовать традиционные try/catch
внутри любой объявленной функции async
, и try/catch
будет перехватывать любые отклоненные обещания с await
.
Если вы не используете try / catch и await
внутри вашей функции отклоняет, то обещание, которое возвращает сама функция, будет отклонено, и вызывающая сторона вашей функции получитотклоненное обещание.
Итак, все зависит от ситуации.Если вы хотите обрабатывать отклонение локально, то вы должны использовать try / catch около await
(так же, как если бы вы .catch()
. Если вы хотите, чтобы отклонение всплывало до вызывающего абонента, чтобы они увидели отклоненное обещание, тогдавам не нужен try/catch
, поскольку интерпретатор Javascript автоматически выдаст отклоненный await
, отклонив обещание, которое возвращает функция async
.