Typescript & TypeORM:不能在模块外使用 import 语句

时间:2021-05-15 11:08:44

标签: javascript node.js typescript postgresql typeorm

我已经使用 TypeORM 设置了一个 Typescript 项目,但我在编译方面遇到了一些问题。

我的包结构是这样的:

root
├── db
│   ├── migrations
│   │   ├── a_migration.ts
│   ├── connection
│   │   ├── config.ts <- ormconfig
│   │   ├── encrypt.ts
│   │   ├── index.ts <- creates the connection
├── src
│   ├── card
│   │   ├── entity.ts
├── package.json
├── tsconfig.json

我的 config.ts 是:


export = {
  type: 'postgres',
  host: POSTGRES_HOST,
  port: POSTGRES_PORT,
  username: POSTGRES_USER,
  password: POSTGRES_PASS,
  database: POSTGRES_DB,
  synchronize: true,
  logging: false,
  entities: ['**src/**/*entity.{ts,js}'],
  migrations: ['**/migrations/*.{ts,js}'],
  cli: {
    entitiesDir: 'src/entity',
    migrationsDir: 'db/migrations',
  },
  namingStrategy: new SnakeNamingStrategy(),
};

tsconfig.json:

{
  "compilerOptions": {
    "baseUrl": ".",
    "target": "es6",
    "module": "CommonJS",
    "allowJs": false,
    "esModuleInterop": true,
    "noImplicitAny": true,
    "resolveJsonModule": true,
    "outDir": "./build",
    "strict": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  },
  "include": ["./src/*", "./db/*"],
  "exclude": ["./**/__tests__/*", "./**/__functionaltests__/*"]
}

我尝试用 ** + path.join 替换实体和迁移中的 __dirname 前缀,但是 typeorm 无法检测到迁移文件和实体。我知道这与解析代码最终位于 build 文件夹下的路径有关,但我不确定如何解决此问题。

如果我这样生活,CLI 适用于使用 nodemon 之类的东西执行应用程序的未编译代码 (ts),但不适用于已编译 (js) 代码。

我从编译的 js 中得到的错误是: SyntaxError: Cannot use import statement outside a module

感谢任何帮助,非常感谢!

2 个答案:

答案 0 :(得分:2)

应该为您的实体和迁移提供构建目录而不是 src 目录。

并且 synchronize 应该设置为 false。

尝试更新您的 config.ts,如下所示:

export = {
  type: 'postgres',
  host: POSTGRES_HOST,
  port: POSTGRES_PORT,
  username: POSTGRES_USER,
  password: POSTGRES_PASS,
  database: POSTGRES_DB,
  synchronize: false,
  logging: false,
  entities: ['build/src/**/*entity.{ts,js}'],
  migrations: ['build/db/migrations/*.{ts,js}'],
  cli: {
    entitiesDir: 'src/entity',
    migrationsDir: 'db/migrations',
  },
  namingStrategy: new SnakeNamingStrategy(),
};

注意 entitiesmigrations 属性的变化。如果这不起作用,很可能是因为我指定的路径不在 build 目录中。在这种情况下,请根据需要进行更改。

希望对你有帮助!干杯? !!!

答案 1 :(得分:0)

为您的部署创建环境变量。在 config.ts 中检查 env,然后相应地设置实体和迁移。