Как настроить TypeORM в проекте TypeScript, чтобы он работал везде? - PullRequest
0 голосов
/ 18 июня 2020

Я изо всех сил пытаюсь найти конфигурацию, которая работает для TypeORM в проекте TypeScript во всех средах.

Например, начиная с этого ormconfig.js:

var dotenv = require("dotenv")
dotenv.config()

var connectionOptions = [
  {
    "name": "default",
    "type": "postgres",
    "url": process.env.DATABASE_URL,
  },
  {
    "name": "testing",
    "type": "postgres",
    "url": `${process.env.DATABASE_URL}_test`,
  }];

module.exports = connectionOptions

Но тогда , когда я пытаюсь запустить приложение, я получаю эту ошибку:

No repository for "User" was found. Looks like this entity is not registered in current "default" connection?

Итак, я добавляю объекты в конфигурацию:

var dotenv = require("dotenv")
dotenv.config()

var connectionOptions = [
  {
    "name": "default",
    "type": "postgres",
    "url": process.env.DATABASE_URL,
    "entities": ["src/entity/**/*"],
  },
  {
    "name": "testing",
    "type": "postgres",
    "url": `${process.env.DATABASE_URL}_test`, // TODO: fix
    "entities": ["src/entity/**/*"],
  }];

module.exports = connectionOptions

На этом этапе приложение запускается в dev (ts-node-dev src/main.ts) работает. Но когда я компилирую его и пытаюсь запустить JavaScript, я получаю эту ошибку:

C:\Users\pupeno\Documents\Flexpoint Tech\js\exp7\backend\src\entity\User.ts:1
import {BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn} from "typeorm"
^^^^^^

SyntaxError: Cannot use import statement outside a module

Он пытается загрузить исходный файл User.ts вместо скомпилированного User.js.

Я запускаю свое приложение в продукте, запустив node build/src/main.js, проблема в том, что ormconfig.js все еще находится на верхнем уровне, печать __dirname и __filename показывает:

C:\Users\pupeno\Documents\Flexpoint Tech\js\exp7\backend
C:\Users\pupeno\Documents\Flexpoint Tech\js\exp7\backend\ormconfig.js

Как вы должны настроить TypeORM для работы как в разработке, так и в производстве?

Переименование моей сущности в User.entity.ts и установка сущностей следующим образом:

var dotenv = require("dotenv")
dotenv.config()

var connectionOptions = [
  {
    "name": "default",
    "type": "postgres",
    "url": process.env.DATABASE_URL,
    "entities": [__dirname + '/**/*.entity{.ts,.js}'],
  },
  {
    "name": "testing",
    "type": "postgres",
    "url": `${process.env.DATABASE_URL}_test`, // TODO: fix
    "entities": [__dirname + '/**/*.entity{.ts,.js}'],
  }];

console.log(connectionOptions)

module.exports = connectionOptions

вызывает ту же ошибку, поскольку Node пытается загрузить файл TypeScript:

(node:19344) UnhandledPromiseRejectionWarning: C:\Users\pupeno\Documents\Flexpoint Tech\js\exp7\backend\src\entity\User.entity.ts:1
import {BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn} from "typeorm"
^^^^^^

SyntaxError: Cannot use import statement outside a module

1 Ответ

0 голосов
/ 18 июня 2020

Мое решение этой проблемы состоит в том, чтобы импортировать модели как классы вместо того, чтобы пытаться заставить глобус работать. Я также не использую ormconfig. js, но сохраняю все в TypeScript с классом диспетчера соединений. Итак, ваш пример, переписанный для меня, будет выглядеть так:

import {createConnection, Connection} from "typeorm";

import {User} from "./models";

export getConnection = async (): Promise<Connection> => {
  const connection = await createConnection({
    name: "testing",
    type: "postgres",
    url: process.env.DATABASE_URL,
    entities: [User]
  });

  return await connection.connect();
}

Это может хорошо работать, если у вас небольшое количество моделей, но не очень хорошо масштабируется. Если у вас много моделей, вы можете экспортировать их все из индекса, а затем импортировать их все из этого индекса.

export * from "./User";
export * from "./Foo";
export * from "./Bar";

Теперь вот импорт

import {createConnection, Connection} from "typeorm";

import * as models from "./models";

export getConnection = async (): Promise<Connection> => {
  const connection = await createConnection({
    name: "testing",
    type: "postgres",
    url: process.env.DATABASE_URL,
    entities: [...Object.values(models)]
  });

  return await connection.connect();
}

И, наконец, dotenv - это little simpleisti c за выполнение этой работы на свой вкус. Я рекомендую вам проверить https://github.com/lorenwest/node-config и посмотреть, как у вас может быть базовая конфигурация, env-specifici c config и envvars - все они хорошо работают вместе.

...