はじめに
TypeORMのcreateConnectionメソッドを呼ぶ際の設定値は、色々な指定方法があります。
色々あって迷っちゃったので、整理して考えた結果、ormconfig.jsに書くのが分かりやすいのではという結論に至りました。
createConnectionメソッドの引数として直接渡す方法は避けたかった
createConnectionメソッドでは、引数としてconnectionの設定値を直接渡す方法があります。
https://typeorm.io/#/connection/creating-a-new-connection
import{createConnection,Connection}from"typeorm";constconnection=awaitcreateConnection({type:"mysql",host:"localhost",port:3306,username:"test",password:"test",database:"test"});
バックエンドのアプリケーションにおいて、createConnectionを呼ぶのは大抵の場合、サーバー起動時に一回だけでしょう。そのため、一見するとこの方法でもさほど問題なさそうに思えます。
ところがTypeORMは、バックエンドアプリケーション用の本番コードからだけでなく、何らかのテストコードからとか、DBマイグレーション用のCLIコマンドから呼ばれる場合もあるはずです。
それらを視野に入れると、createConnectionの引数として直接渡すだけではカバーしにくい場面がでてきそうです。似たような設定を何箇所かに重複して書く羽目になるかもしれません。
引数として直接渡す以外の方法は色々ある
では他の方法はというと、大別すると2種類があります。このあと紹介するそれらの方法で設定した上で、引数なしでcreateConnectionメソッドを呼べば、その設定が参照されます(Creating a new connectionの節の後半で、そう説明されています)。
環境変数TYPEORM_XXXを設定する
1つ目は、何らかの手段によって、所定の名前の環境変数を設定する方法です。
TYPEORM_CONNECTION
やTYPEORM_HOST
など、TYPEORM_XXX
という名前の環境変数を設定しておくと、TypeORMはその値を参照します。参照される環境変数名は、以下のURLにまとめられています。
https://typeorm.io/#/using-ormconfig/using-environment-variables
この方法の亜種として、環境変数を設定する代わりに、ormconfig.envというファイルにそれらの設定を書く方法もあります。
ormconfigファイルを作る
2つ目は、ormconfig.xxx(ただし、xxx ≠ env)というファイルをpackage.jsonと同じ階層に置き、そこに設定を書く方法です。拡張子はjs、json、ymlなどから選べます。
module.exports={"type":"mysql","host":"localhost","port":3306,"username":"test","password":"test","database":"test"}
環境変数TYPEORM_XXXとormconfigの併用はできない
下記のURLで述べられている通り、上記2種類の設定方法を併用することはできません。環境変数TYPEORM_XXXが設定されていると、ormconfigファイルは無視されます。
https://typeorm.io/#/using-ormconfig/which-configuration-file-is-used-by-typeorm
TypeORMの設定値の中には、環境変数で指定したいものもあるでしょうし(例えばDBのパスワード)、分かりやすくどこかにハードコードしたいものもあるでしょう。ところがあいにく、環境変数TYPEORM_XXXとormconfigファイルの併用はできません。
そこで
そこで、以下のようにすればちょうど良い落とし所になるのではと考えました。
- ormconfig.jsファイルを用意する。
- ormconfig.jsの中で必要に応じて、環境変数を参照する。
この時、ormconfig.jsに書く環境変数名はTYPEORM_XXXではなく、TypeORMが予約していない何らかの独自の名前にします。そうすれば、「環境変数TYPEORM_XXXが設定されていると、ormconfigファイルは無視される」という制約を気にせず、柔軟に設定をかけるようになります。
jsファイルなので、環境変数の値に応じたちょっとした分岐を書きやすい利点もあります。
まとめ
TypeORMは、バックエンドアプリケーション用の本番コードからだけでなく、何らかのテストコードからとか、DBマイグレーション用のCLIコマンドから呼ばれる場合もあるので、1個の設定用ファイルにまとめて書いておけば、どこから呼んだ場合でも対応できます。
そして、設定用ファイルの種類としてormconfig.jsを使えば、jsファイルの中で環境変数(TYPEORM_XXXでない独自名)を参照させたり、ちょっとした分岐を書いたりと、柔軟に設定を書くことができます。
その環境変数はどこでどう設定するんかっていう点は残りますが、それはTypeORMの専用知識とは切り離した汎用的な問題として、独立して検討しやすいでしよう。また、TypeORM設定の入り口がormconfig.jsという一箇所に集約されるので、(jsファイルの中で、どこかで設定されている環境変数を参照しているとはいえ、)見通しもそこそこ良くなります。