Node.js,Typescript,ts-node-dev和顶级等待

时间:2020-10-30 14:39:19

标签: node.js typescript async-await

我已经花了一个小时,在需要顶层等待之后寻找新错误的解决方案。到目前为止,我尝试过的所有其他操作都无法解决错误,例如将"type": "module"添加到package.json文件。启动服务时,错误消息为Cannot use import statement outside a module。 如果我将更改"module": "ESNext",还原为"module": "commonjs",,它就可以正常工作(除非必须删除await关键字,并且以某种方式将其重构为无需等待即可工作)。

此外,我使用ts-node-dev来运行可在package.json文件中看到的服务。

  • 我需要的新软件包是kafkajs。
  • 节点版本:v14.9.0
  • 打字稿版本:4.0

package.json

{
  "name": "",
  "version": "1.0.0",
  "description": "microservice",
  "main": "src/index.ts",
  "author": "",
  "type": "module",
  "license": "MIT",
  "scripts": {
    "dev": "NODE_ENV=development tsnd --respawn --files src/index.ts",
    "prod": "NODE_ENV=production tsnd --respawn --transpile-only --files src/index.ts",
    "test": "mocha --exit -r ts-node/register tests/**/*.spec.ts",
    "eslint": "eslint src/**/*.ts"
  },

tsconfig.json

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "moduleResolution": "node",
    "outDir": "dist",
    "sourceMap": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  },
  "ts-node": {
    "files": true,
    "transpileOnly": true
  },
  "include": ["src/**/*.ts", "declariations/**.d.ts"],
  "exclude": ["node_modules", ".vscode"]
}

1 个答案:

答案 0 :(得分:0)

TL; DR :请勿将ECMAScript模块与ts-node或ts-node-dev(尚未使用)一起使用;只需重构顶层等待状态

今天,从无害的错误开始,我跌倒了同一个兔子洞:

Top-level 'await' expressions are only allowed when the 'module' option is set to 'esnext' or 'system', and the 'target' option is set to 'es2017' or higher.

结果,我倾向于编辑tsconfig.json并将module设置为esnext,这反过来又迫使我将moduleResolution设置为node最后将type: module添加到我的package.json中。我没有意识到(并且IMO他们不应该在错误消息中建议这一点-您只需重构顶层等待状态),就可以将NodeJS的模块解析策略从CommonJS切换到ESM。实际上,由于许多原因,这很重要:

我觉得在这个时候(2020年12月),NodeJS生态系统仍在从经典的CommonJS模块过渡到新的ECMAScript模块。结果,其他技术(例如ts-node或ts-node-dev)也在过渡,并且支持可能不稳定。我的建议是坚持使用CommonJS,直到尘埃落定并且这些东西“开箱即用”为止。