TypeScript
ORM
TypeORM

TypeORMのmigrationで.tsファイルを直接参照したい


  • TypeORM v0.2.6

  • Node.js v10.11.0

TypeORMのmigrationを使うため、公式ドキュメントを参考にrootにormconfig.jsを置いてDB情報を設定


ormconfig.js

module.exports = {

type: 'postgres',
host: 'localhost',
port: 5432,
database: 'hogehoge',
username: 'hogehoge',
password: 'hogehoge',
entities: ["build/server/database/entities/*.js"], // <- ビルドされたJSファイルを参照している
subscribers: [],
migrations: ['migrations/*'],
cli: {
migrationsDir: 'migrations',
},
};

以下のコマンドを実行してmigrationファイルを生成

yarn typeorm migration:generate -n hogehoge

問題なくmigrationファイルが生成された。

ただこれだと、TypeScriptで書いている場合必ずビルドしてから実行しないと定義にずれが生じる可能性があるのでこうしてみた

// ...

entities: ["src/server/database/entities/*.ts"],
// ...

エラーが起きる

(function (exports, require, module, __filename, __dirname) { import {Entity, PrimaryGeneratedColumn} from 'typeorm';

^

SyntaxError: Unexpected token {
at new Script (vm.js:79:7)
at createScript (vm.js:251:10)
at Object.runInThisContext (vm.js:303:10)
at Module._compile (internal/modules/cjs/loader.js:657:28)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Module.require (internal/modules/cjs/loader.js:637:17)
at require (internal/modules/cjs/helpers.js:20:18)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

\(^o^)/


解決策

https://github.com/typeorm/typeorm/issues/371#issuecomment-289829588


you node environment tries to load src/entity/User.ts, but it should load .js. So you either need to run app with ts-node, or set proper configuration for JS FILES in your ormconfig cli section, e.g. dist/migrations/.*js


コマンドをこう治すと問題なく動くようになる

ts-node ./node_modules/.bin/typeorm migration:generate -n hogehoge

まあTSファイルはTS実行環境じゃないとだめだよね・・・