【问题标题】:pass string variable to 'type' in TypeOrmModuleOptions将字符串变量传递给 TypeOrmModuleOptions 中的“类型”
【发布时间】:2020-01-30 12:32:18
【问题描述】:

我想使用 TypeORM 为我的 NestJs 应用程序设置数据库连接。我有一个配置文件,它从.env 文件中读取所有值

import { DotenvConfigOutput, config } from 'dotenv';

const envFound: DotenvConfigOutput = config();

if (!envFound) {
  throw new Error('.env file was not found.');
}

process.env.NODE_ENV = process.env.NODE_ENV || 'development';

export const DATABASE_TYPE: string = process.env.DATABASE_TYPE || 'postgres';
export const DATABASE_USERNAME: string = process.env.DATABASE_USERNAME || 'admin';
export const DATABASE_PASSWORD: string = process.env.DATABASE_PASSWORD || 'myPW';
export const DATABASE_HOST: string = process.env.DATABASE_HOST || 'localhost';
export const DATABASE_PORT: number = Number(process.env.DATABASE_PORT) || 5432;
export const DATABASE_NAME: string = process.env.DATABASE_NAME || 'myDB';
export const DATABASE_SYNCHRONIZE: boolean = Boolean(process.env.DATABASE_SYNCHRONIZE) || true;

我正在 app.module 中设置连接,所以在应用程序启动时。

import {
  DATABASE_TYPE,
  DATABASE_HOST,
  DATABASE_PORT,
  DATABASE_USERNAME,
  DATABASE_PASSWORD,
  DATABASE_NAME,
  DATABASE_SYNCHRONIZE,
} from './config';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: DATABASE_TYPE,
      host: DATABASE_HOST,
      port: DATABASE_PORT,
      username: DATABASE_USERNAME,
      password: DATABASE_PASSWORD,
      database: DATABASE_NAME,
      entities: [],
      synchronize: DATABASE_SYNCHRONIZE,
    }),
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

很遗憾,我在 type 字段中收到此错误

类型 'string' 不能分配给类型 '"mysql" | "mariadb" | “postgres” | “蟑螂数据库” | "sqlite" | "mssql" | “神谕” | “科尔多瓦” | “本机脚本” | “反应原生” | "sqljs" | "mongodb" | “极光数据API” | “博览会”'.ts(2322) MysqlConnectionOptions.d.ts(12, 14):预期的类型来自声明的属性'type' 在这里输入“TypeOrmModuleOptions”

我不想传入像'postgres' 这样的硬编码字符串,因为我希望它保持动态。我更喜欢 Postgres,但有些客户使用 oracle 数据库,我也必须支持 MSSQL。

如何解决该配置问题?

【问题讨论】:

    标签: javascript node.js nestjs typeorm dotenv


    【解决方案1】:

    这对我有用:

    TypeOrmModule.forRoot({
      type: "sqlite" as any,
      host: "localhost",
      database: "./database/sqlite"
    })
    

    我花了整个周末试图弄清楚这个问题,但被难住了。

    有人有更好的解决方案或解释吗?

    【讨论】:

    • 你找到解决这个问题的方法了吗?
    【解决方案2】:

    将您的数据库类型转换为字符串,如下所示:

       export const DATABASE_TYPE: any = String(process.env.DATABASE_TYPE) || 'postgres';
    

    【讨论】:

    • 对不起,这对我不起作用。错误仍然存​​在
    • 请检查我更新的答案,我将类型更改为any希望这有帮助
    • hm 错误消失了 :) 我可以将强制转换为字符串,any 似乎就足够了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2019-11-27
    • 2020-06-16
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多