当我尝试在Heroku上启动我的应用程序时,我得到了以下堆栈跟踪。 它只是一个基本的ts.app,就像你看到的ts-node和nodemon。

我很想知道答案是什么。

2020-05-30T00:03:12.201106+00:00 heroku[web.1]: Starting process with command `npm start`
2020-05-30T00:03:14.405285+00:00 app[web.1]: 
2020-05-30T00:03:14.405303+00:00 app[web.1]: > discordtoornamentmanager@1.0.0 start /app
2020-05-30T00:03:14.405303+00:00 app[web.1]: > ts-node src/App.ts
2020-05-30T00:03:14.405304+00:00 app[web.1]: 
2020-05-30T00:03:14.833655+00:00 app[web.1]: (node:23) ExperimentalWarning: The ESM module loader is experimental.
2020-05-30T00:03:14.839311+00:00 app[web.1]: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /app/src/App.ts
2020-05-30T00:03:14.839312+00:00 app[web.1]:     at Loader.defaultGetFormat [as _getFormat] (internal/modules/esm/get_format.js:65:15)
2020-05-30T00:03:14.839314+00:00 app[web.1]:     at Loader.getFormat (internal/modules/esm/loader.js:113:42)
2020-05-30T00:03:14.839315+00:00 app[web.1]:     at Loader.getModuleJob (internal/modules/esm/loader.js:244:31)
2020-05-30T00:03:14.839315+00:00 app[web.1]:     at processTicksAndRejections (internal/process/task_queues.js:97:5)
2020-05-30T00:03:14.839316+00:00 app[web.1]:     at Loader.import (internal/modules/esm/loader.js:178:17)
2020-05-30T00:03:14.847801+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2020-05-30T00:03:14.847998+00:00 app[web.1]: npm ERR! errno 1
2020-05-30T00:03:14.848957+00:00 app[web.1]: npm ERR! discordtoornamentmanager@1.0.0 start: `ts-node src/App.ts`
2020-05-30T00:03:14.849050+00:00 app[web.1]: npm ERR! Exit status 1
2020-05-30T00:03:14.849172+00:00 app[web.1]: npm ERR! 
2020-05-30T00:03:14.849254+00:00 app[web.1]: npm ERR! Failed at the discordtoornamentmanager@1.0.0 start script.
2020-05-30T00:03:14.849337+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2020-05-30T00:03:14.854859+00:00 app[web.1]: 
2020-05-30T00:03:14.854998+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2020-05-30T00:03:14.855069+00:00 app[web.1]: npm ERR!     /app/.npm/_logs/2020-05-30T00_03_14_850Z-debug.log
2020-05-30T00:03:14.907689+00:00 heroku[web.1]: Process exited with status 1
2020-05-30T00:03:14.943718+00:00 heroku[web.1]: State changed from starting to crashed

这是我的package。json

{
   "name": "discordtoornamentmanager",
   "version": "1.0.0",
   "description": "",
   "main": "dist/app.js",
   "type": "module",
   "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1",
      "dev": "nodemon -x ts-node src/App.ts",
      "start": "ts-node src/App.ts"
   },
   "keywords": [],
   "author": "",
   "license": "ISC",
   "dependencies": {
      "@types/node": "^14.0.5",
      "axios": "^0.19.2",
      "discord.js": "^12.2.0",
      "pg": "^8.2.1",
      "reflect-metadata": "^0.1.10",
      "typeorm": "0.2.25",
      "typescript": "^3.9.3",
      "nodemon": "^2.0.4",
      "ts-node": "8.10.1"

   }
}

这是tsconfig

{
   "compilerOptions": {
      "lib": [
         "es6"
      ],
      "target": "es6",
      "module": "commonjs",
      "moduleResolution": "node",
      "outDir": "dist",
      "resolveJsonModule": true,
      "emitDecoratorMetadata": true,
      "esModuleInterop": true,
      "experimentalDecorators": true,
      "sourceMap": true
   },
   "include": ["src/**/*.ts"],
   "exclude": ["node_modules", "**/*.spec.ts"]
}

当前回答

尝试将其添加到tsconfig.json中

"ts-node": {
    "esm": true,
    "experimentalSpecifierResolution": "node",
}

我可以用tsconfig来修复。Json,看起来像这样:

{
  "compilerOptions": {
    "target": "es2022",
    "lib": ["ES2022"],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "ES2022",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
  },
  "exclude": [
    "node_modules",
  ],
  "ts-node": {
    "esm": true,
    "experimentalSpecifierResolution": "node",
  }
}

其他回答

用——esm运行ts-node对我有用。

例如:

ts-node --esm src/App.ts

该错误是由于试图导入模块而导致的,如果没有ES modules标志,ts-node就不支持导入模块。

你可以使用ts-node-esm代替ts-node,在package中保留"type":"module"。在.ts文件中导入'./module.js'。

相关:https://github.com/TypeStrong/ts-node/issues/1007

更新:

这个答案有一个更好的解决方案,允许导入没有.js扩展名的模块:

https://stackoverflow.com/a/65163089/1482990

解决方案一

从包中删除"type": "module"。Json 在tsconfig。将模块属性设置为CommonJS模块:"CommonJS"和modulerresolve: "Node"

解决方案2

如果第一个不工作,或者你有一些原因保持模块:"ESNext"

1-在package.json中添加"type": "module

2-安装ts-node npm i -g ts-node

3-执行tsconfig。Json,并添加以下内容:

{
    "compilerOptions": {
        "module": "ESNext",
        "moduleResolution": "Node",
        /* ... your props ... */
    },
    "ts-node": {
        "esm": true
    }
}

4—执行ts-node fileName.ts命令

我第一次遇到这个问题大概是在一年多以前,ts-node还没有修复它。以上的方法都不适合我,我似乎什么都试过了。

我只是使用了tsc——outDir输出文件。Ts,然后使用node out/file.js正常运行文件,然后添加到.gitignore. js文件中。

ts-node背后的思想很好,但当它不能处理像这样简单的例子时,它真的很糟糕。抱歉,解决方案不使用ts节点,但我不能让它工作。

改变我的

"moduleResolution": "node", 

to

"moduleResolution": "Node",

在包中。Json为我解决了这个问题