typescript 如何处理Node中的“Cannot use import statement outside a module”错误,js + TypeORM seeding案例?

cclgggtu  于 2023-05-01  发布在  TypeScript
关注(0)|答案(1)|浏览(208)

我得到了错误
[cause]:错误:无法打开文件:“D:\IntelliJ IDEA***\TypeORM_DataSource。ts”。不能在模块外使用import语句
尝试运行播种机时出错

typeorm-seeding \
  --dataSource 01-Source/Implementation/Elements/DataBase/TypeORM_DataSource.ts \
  seed 01-Source/Implementation/Elements/DataBase/Seeders/*.ts

使用@jorgebodega/typeorm-seeding。
好吧,这是频繁的错误与ts-node,但每次的原因,因此解决方案是不同的。在我的例子中,将"type": "module"添加到package.json并不能解决问题。
顺便说一下,TypeORM迁移工作正常:

typeorm-ts-node-esm migration:generate ./01-Source/Implementation/Elements/DataBase/Migrations/Initialization -d ./01-Source/Implementation/Elements/DataBase/TypeORM_DataSource.ts

起因思路

documentation中,给出了.ts的例子:

typeorm-seeding seed -d path/to/datasource src/seeders/*.ts

因此,typeorm-seeding必须具有内置的TypeScript支持。最有可能的是使用ts-node
export/imports关键字的使用完全是TypeScript的基本场景。它将被翻译成不同的问题。typeorm-seeding不应该关心将输入的TypeScript转换为适当类型的模块吗?

附录

TypeScript配置

理论上,ts-node设置应该可以解决模块类型的问题。

{

  "compilerOptions": {

    "target": "ESNext",
    "module": "ESNext",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,

    "strict": true,
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "experimentalDecorators": true,

    "emitDecoratorMetadata": true,

    "baseUrl": "./01-Source",
    "paths": {
      "@CommonSolution/*": [ "./CommonSolution/*"],
      /* ... */
    }
  },

  "ts-node": {
    "compilerOptions": {
      "module": "CommonJS"
    },
    "require": [
      "tsconfig-paths/register"
    ]
  }

}

docker-compose。亚姆勒

version: "3.5"

services:

  Database:

    image: postgres
    container_name: Example-Local-Database
    ports:
      - "${DATABASE_PORT}:${DATABASE_PORT}"

    environment:
      - "POSTGRES_PASSWORD=${DATABASE_PASSWORD}"

    volumes:
      - DatabaseData:/var/lib/postgresql/data

  # ...

volumes:
  DatabaseData:
    name: Example-Local-DatabaseData
    driver: local
dba5bblo

dba5bblo1#

您正在使用

"ts-node": {
    "compilerOptions": {
      "module": "CommonJS"
    },
    "require": [
      "tsconfig-paths/register"
    ]
  }

package.json中的"type": "module"所做的事情是将node * 从 * commonjs模块切换到esnext,因此您现在试图将CommonJS模块导入为ESNext,这可能会导致错误
尝试从ts-node compilerOptions中删除"module": "CommonJS"
我建议尝试https://github.com/esbuild-kit/tsx作为ts-node的更现代和更稳定的替代品。在大多数情况下,它“只是工作”。

相关问题