我应该如何在 ormconfig.json 中指定 DATABASE_URL?

Ste*_*ems 4 heroku typescript typeorm

我正在尝试将我的 Vesper 服务器部署到 Heroku,而 Vesper 需要一个 ormconfig.json 文件。

当我使用本地数据库时,这很好用,因为我可以填写将组合到连接字符串中的所有字段。但是,当我在 Heroku 中添加一个 db 时,我只得到了完整的 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"
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望我可以只用 database_url 替换大多数字段,但我找不到任何说明我应该用什么名称命名的文档。

zen*_*eni 6

您可以使用 url 解析器进行 heroku env var 解析,例如pg-connection-string https://www.npmjs.com/package/pg-connection-string

然后你使用createConnectionTypeOrm 给出的函数在服务器端初始化 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);
...
Run Code Online (Sandbox Code Playgroud)

如果您管理不同的配置,您可能需要修改此代码段,以便您可以根据环境启用/禁用 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");
});
Run Code Online (Sandbox Code Playgroud)

  • 至少从版本0.2.25开始,`createConnection`接受url参数,因此上面可以简化为:`const typeOrmOptions: ConnectionOptions = {type: "postgres", url: process.env.DATABASE_URL, ...}; ` 不需要 `pg-connection-string` 依赖项。`ConnectionOptions` 可以直接从 TypeORM 导入。 (3认同)