Heroku上的错误:'语法错误:不能在模块外使用import语句

au9on6nz  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(110)

当我尝试将我用TypeScript编写的node.js后端部署到Heroku时,我遇到了一个非常奇怪的bug。同样的代码集在我的本地环境(以及我队友的所有本地环境)中运行得很好,但在Heroku上却失败了。Heroku日志给了我以下错误:

(node:4) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
import dotenv from "dotenv";
^^^^^^
SyntaxError: Cannot use import statement outside a module

我查找了其他stackoverflow post,他们说我需要在我的package.json文件中包含"type": "module",以便启用import。然而,这样做会给我带来另一个错误:

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"

如果我想使用import语句,基本上就失去了识别.ts文件的能力。我在不同的stackoverflow帖子中尝试了很多方法,但它们都不起作用。所以我停止了“修复”我的代码,因为我的代码在本地环境中运行得很好。我想知道这是否是Heroku的问题,Heroku上是否有我可以更改的设置,以便此代码可以像我的本地环境一样工作?

或者,是否有更好的方法来修复使用TypeScript时的import语句问题?

以下是我的package.json文件,供您参考:

{
  "name": "booknbucks-backend",
  "version": "1.22.15",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "start": "node app.ts",
    "dev": "nodemon app.ts",
    "build": "tsc",
    "production": "node dist/app.js"
  },
  "dependencies": {
    "@types/dotenv": "^8.2.0",
    "@types/express": "^4.17.13",
    "@types/mongodb": "^4.0.7",
    "bcryptjs": "^2.4.3",
    "compression": "^1.7.4",
    "cors": "^2.8.5",
    "dotenv": "^16.0.0",
    "express": "^4.17.2",
    "firebase-admin": "^10.0.2",
    "helmet": "^5.0.2",
    "jsonwebtoken": "^8.5.1",
    "moment": "^2.29.1",
    "mongoose": "^6.2.0",
    "mongoose-paginate-v2": "^1.6.3",
    "node-cron": "^3.0.0",
    "typescript": "^4.6.3"
  }
}

下面是我的tsconfig.json文件:

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "esnext",
    "sourceMap": true,
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "outDir": "dist",
    "baseUrl": "."
  },
  "exclude": ["node_modules"],
  "include": ["**/*.ts"]
}
ocebsuys

ocebsuys1#

您的建置指令码正在执行tsc,但您的启动指令码仍会尝试执行未编译的.ts档案,而不是已编译的.js档案。
请将其指向编译的文件:

"start": "node dist/app.js",

请注意,如果启动脚本存在,则Procfile将优先于启动脚本,因此请确保也在那里进行检查。

相关问题