await
只能在用 声明的函数内部使用async
关键词。
async function doSomething() {
let result = await someMongoooseFunctionThatReturnsAPromise();
// use result here
}
await
不能在外部使用async
功能。这就是你的错误告诉你的,它与猫鼬完全无关。它与调用 mongoose 函数的代码结构有关。
NOTE:任何 Node.js 事件驱动代码都已在函数内,因此可以使用await
在该函数中,您所要做的就是添加async
包含函数定义的关键字。如果该函数的调用者不期望任何返回结果,则不需要进一步的更改。如果该函数的调用者期望返回结果,那么您必须调整调用代码以期望从async
声明的函数。
还值得理解的是async
函数总是返回一个承诺。虽然您可以像常规顺序代码一样编写它:
async function doSomething() {
let result = await someMongoooseFunctionThatReturnsAPromise();
// use result here
result++;
return result;
}
该函数实际上返回一个 Promise,该 Promise 的解析值将是该函数的返回值。所以,当您使用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/catchawait
(很像你会用.catch()
。如果您希望拒绝冒泡给调用者,以便他们看到被拒绝的承诺,那么您不需要try/catch
因为 Javascript 解释器会自动冒泡拒绝await
通过拒绝承诺async
函数返回。