当我尝试将我用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"]
}
1条答案
按热度按时间ocebsuys1#
您的建置指令码正在执行
tsc
,但您的启动指令码仍会尝试执行未编译的.ts
档案,而不是已编译的.js
档案。请将其指向编译的文件:
请注意,如果启动脚本存在,则
Procfile
将优先于启动脚本,因此请确保也在那里进行检查。