我是nodejs的新手,虽然熟悉异步编程的基本概念,但我没有太多编写异步代码的经验。
我正在写一个简单的Web应用程序,它将使用sequelize连接到数据库。开始时,我使用了他们的示例代码(https://sequelize.org/docs/v6/getting-started/):
try {
await sequelize.authenticate();
console.log('Connection has been established successfully.');
} catch (error) {
console.error('Unable to connect to the database:', error);
}
这导致了错误:await is only valid in async functions and the top level bodies of modules
。利用我所掌握的一点知识,我将代码改为:
Promise.resolve().then(async () => {
await sequelize.authenticate();
console.log('Connection has been established successfully.');
}).catch(error => {
console.error('Unable to connect to the database:', error);
});
它按预期工作。但据我所知,我的代码的两个版本本质上是完全相同的(除了第一个例子要简单得多,在可读性方面吸引我)
我缺少什么?为什么我不能在我的第一个例子中使用await
,“顶级模块体”到底是什么意思?
1条答案
按热度按时间xzabzqsa1#
不能在第一个例子中使用await的原因是(try...catch)所在的代码块不在异步函数中。Wait只能在async函数中使用,这些函数是使用async关键字声明的。
短语“模块的顶级主体”指的是代码运行的上下文。在Node.js中,任何函数或代码块之外的代码都被视为“顶级”。但是,在异步函数之外使用await只允许在模块体(文件)中使用,而不是在全局上下文或常规函数体中使用。
总之,你只能在async函数中使用wait。在第一个例子中,因为代码块不在异步函数中,所以必须将其 Package 在promise中或移动到异步函数中才能使用await。将所有内容 Package 在异步函数中,它应该可以工作。