網站搜尋

typescript - 我應該如何在 ormconfig.json 中指定 DATABASE_URL?


我正在嘗試將我的 Vesper 伺服器部署到 Heroku,而 Vesper 需要一個 ormconfig.json 檔案。

當我使用本地資料庫時,這運作得非常好,因為我可以填寫將組合成連接字串的所有欄位。然而,當我在 Heroku 添加資料庫時,我只得到完整的 URL,而找不到放置它的位置。

這是我目前的 ormconfig.json。

{
  "type": "postgres",
  "host": "localhost",
  "port": 5432,
  "username": "postgres",
  "password": "password",
  "database": "test",
  "synchronize": true,
  "entities": ["target/entity/**/*.js"],
  "migrations": ["target/migrations/*.js"],
  "cli": {
    "migrationsDir": "src/migrations"
  }
}

我希望我可以只用 database_url 替換大多數欄位,但我找不到任何說明文檔說明我應該以什麼名稱放置它。

答案#1

你可以使用 URL 解析器來解析 Heroku 環境變數,例如 pg-connection-string https://www.npmjs.com/package/pg-connection-string

然後你使用 TypeOrm 提供的 createConnection 函數在伺服器端初始化 TypeOrm。

import * as PostgressConnectionStringParser from "pg-connection-string";

const databaseUrl: string = process.env.DATABASE_URL;
const connectionOptions = PostgressConnectionStringParser.parse(databaseUrl);
const typeOrmOptions: PostgresConnectionOptions = {
    type: "postgres",
    name: connectionOptions.name,
    host: connectionOptions.host,
    port: connectionOptions.port,
    username: connectionOptions.username,
    password: connectionOptions.password,
    database: connectionOptions.database,
    synchronize: true,
    entities: ["target/entity/**/*.js"],
    extra: {
        ssl: true
    }
};
const connection = createConnection(typeOrmOptions);
...

如果你管理不同的配置,你可能需要修改這段程式碼,這樣你就可以根據環境啟用或禁用 SSL,例如(開發模式下不使用 SSL,ts-node 以 .ts 格式抓取實體,等等...)。

如果你真的需要生成 ormconfig.json,那麼恐怕你必須從一個腳本文件生成該文件,使用前面的代碼,只需添加一個寫入的部分:

...
const json = JSON.stringify(typeOrmOptions, null, 2);
fs.writeFile("./target/ormconfig.json", json, (err) => {
    if (err) {
        console.error(err);
        return;
    }
    console.log("File has been created");
});