Deno文件顶层使用await报“仅能在async函数内”错误的解决
问题根源
你碰到的这个报错根本不是Deno运行时抛出的执行错误——你写的代码在Deno环境下可以正常运行,飘红完全是VSCode的TypeScript语言服务配置不对:
- 默认情况下TS会把当前项目识别为CommonJS模块,这类模块规范本身不允许在文件全局顶层作用域直接写await
- Deno从1.0版本开始就原生支持ES模块规范下的顶层await,所以完全不存在“代码不符合Deno规则”的问题,只是编辑器没识别对模块类型才报的错
实际修复步骤
- 给项目加匹配Deno规则的TS配置
在项目根目录创建deno.json文件,加上对应的编译选项,告诉TS当前项目用ES2022模块规范:
配完重启下VSCode的TS服务,原来飘红的报错会直接消失,一行业务代码都不用改。{ "compilerOptions": { "module": "ES2022", "target": "ES2022" } } - 确认VSCode的Deno扩展正常生效
如果配完还是报错,就去检查扩展设置:- 确保当前项目的
deno.enable开关是打开的 - 别让编辑器把项目自动识别成Node.js的CommonJS项目,这类识别规则会直接把顶层await的语法支持关掉
- 确保当前项目的
补充提醒
网上很多老教程会让你把所有代码包进一个立即执行的async函数来消报错,写出来大概是这样:
async function startApp() { await db.connect(); app.start({ port: 5000 }); } startApp();
这种写法本质是为了迁就旧的TS校验逻辑加的冗余代码,在原生支持顶层await的Deno环境下完全没必要这么写。
内容的提问来源于stack exchange,提问作者Rogier de Ruijter
相关产品推荐
相关产品推荐

