当前位置: 首页 > 知识库问答 >
问题:

为什么useFactory选项会使我在nestjs配置中出错?

马弘益
2023-03-14

类型“(ConfigService:ConfigService)=>Promise<{Type:String;Port:String;UserName:String;Password:String;Database:String;Host:String;Entities:String[];Synchronize:Boolean;}>”不能分配给类型“(...args:any[])=>({RetryAttempts?:Number;RetryDelay?:Number;KeepConnectionAlive?:Boolean;}&Partial)({RetryAttempts?:Number;类型“Promise<{Type:String;Port:String;UserName:String;Password:String;Database:String;Host:String;Entities:String[];Synchronize:Boolean;}>”不能分配给类型“({RetryAttempts?:Number;RetryDelay?:Number;KeepConnectionAlive?:Boolean;}&Partial)({RetryAttempts?:Number;RetryDelay?:Number;KeepConnectionAlive?:Boolean;}类型“Promise<{Type:String;Port:String;UserName:String;Password:String;Database:String;Host:String;Entities:String[];Synchronize:Boolean;}>”不能分配给类型“Promise”。类型“{Type:String;Port:String;UserName:String;Password:String;Database:String;Host:String;Entities:String[];Synchronize:Boolean;}”不能分配给类型“TypeOrmModuleOptions”。类型“{Type:String;Port:String;UserName:String;Password:String;Database:String;Host:String;Entities:String[];Synchronize:Boolean;}”不能分配给类型“{RetryAttempts?:Number;RetryDelay?:Number;KeepConnectionAlive?:Boolean;}&Partial”。类型“{Type:String;Port:String;UserName:String;Password:String;Database:String;Host:String;Entities:String[];Synchronize:Boolean;}”不能分配给类型“Partial”。属性“type”的类型不兼容。类型“String”不能分配给类型“Aurora-Data-API”“。

这是nestjs给我的信息,我按照文档中的说明操作,但对我来说并不适用。

这是我的app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CategoryModule } from './category/category.module';
import { ProductModule } from './product/product.module';
import { UnitModule } from './unit/unit.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule } from './config/config.module';
import { ConfigService } from './config/config.service';
import { RolModule } from './rol/rol.module';
import { UserModule } from './user/user.module';
import { AuthModule } from './auth/auth.module';

@Module({
  imports: [TypeOrmModule.forRootAsync({
    imports: [ConfigModule],
    inject: [ConfigService],
    useFactory: async (configService: ConfigService) => ({
      type: 'mysql',
      port: configService.port,
      username: configService.username,
      password: configService.password,
      database: configService.database,
      host: configService.host,
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
  }), CategoryModule, UnitModule, ProductModule, RolModule, UserModule, AuthModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

这是我的配置/config.service.ts

import * as dotenv from 'dotenv';
import * as fs from 'fs';
import * as Joi from '@hapi/joi';

export interface EnvConfig {
    [key: string]: string;
}

export class ConfigService {
    private readonly envConfig: EnvConfig;

    constructor(filePath: string) {
        const config = dotenv.parse(fs.readFileSync(filePath));
        this.envConfig = this.validateInput(config);
    }

    private validateInput(envConfig: EnvConfig): EnvConfig {
        const envVarsSchema: Joi.ObjectSchema = Joi.object({
            NODE_ENV: Joi.string()
            .valid('development', 'production', 'test', 'provision')
            .default('development'),
            PORT: Joi.number().default(3000),
            HOST: Joi.strict(),
            USERNAME: Joi.string(),
            PASSWORD: Joi.string(),
            DATABASE: Joi.string(),
        });

        const { error, value: validatedEnvConfig } = envVarsSchema.validate(
            envConfig,
        );
        if (error) {
            throw new Error(`Config validation error: ${error.message}`);
        }
        return validatedEnvConfig;
    }

    get port(): string {
        return String(this.envConfig.PORT);
    }
    get host(): string {
        return String(this.envConfig.HOST);
    }
    get username(): string {
        return String(this.envConfig.USERNAME);
    }
    get password(): string {
        return String(this.envConfig.PASSWORD);
    }
    get database(): string {
        return String(this.envConfig.DATABASE);
    }
}

这是我的config/config.module.ts

import { Module } from '@nestjs/common';
import { ConfigService } from './config.service';

@Module({
  providers: [{
    provide: ConfigService,
    useValue: new ConfigService(`${process.env.NODE_ENV || 'development'}.env`),
  }],
  exports: [ConfigService],
})
export class ConfigModule {}

useFacetory选项是产生错误的选项,但我不明白为什么我会感谢任何人的帮助

共有1个答案

辛弘壮
2023-03-14

所以问题是,当我试图从.env文件获取端口时,必须将类型转换为数字。示例

useFactory: async (configService: ConfigService) => ({
  type: 'mysql',
  port: Number(configService.port),
  username: configService.username,
  password: configService.password,
  database: configService.database,
  host: configService.host,
  entities: [__dirname + '/**/*.entity{.ts,.js}'],
  synchronize: true,
}),

这就解决了问题

 类似资料:
  • core.js:1671错误类型错误:generatorOrNext不是SafeSubscriber.SchedulerFn[as_next](core.js:3565)在SafeSubscriber.push../node_modules/rxjs/_esm5/internal/subscriber.js.safeSubscriber.__tryRunsub(subscriber.js:195)

  • 我在Mac 10.9.5上使用以下版本的Eclipse(实际上是SpringSource Tool Suite): 我试图安装颠覆性的插件,用于我的Maven项目(使用SVN)。我从他们的网站下载了zip文件,然后创建了以下目录: 我将插件解压缩到这个目录中。然后我重新启动了Eclipse实例。然而,在包资源管理器中右键单击我的项目时,我看不到“团队”下的任何签入选项。在命令行上,这些项目确实有“

  • 我正在用Android制作一个简单的列表视图,它显示为一个对话框。它的目的是让用户选择一个将被保存为SharedReference的项目。下次用户打开同一个列表时,我希望他们上次选择的项目高亮显示。 我的问题是,当我使用ArrayAdapter创建列表时,挑出他们上次选择的索引,然后应用自定义绘图作为背景以显示当前保存的项目,ListView将3个项目显示为“selected”。它总是第一个项目,

  • 我正试图将即时消息添加到现有的应用程序中。但是我不确定应该如何配置socket.io模块。我已经尝试了以下方法: 因为打开一个页面时没有记录connected,所以我假设丢失了一些东西。我的错误在哪里?

  • 我试图在Java中将扫描字符串转换为JSONObject,并从JSON Simple导入JSON模块。我已经在构建路径中添加了JSON-simple-1.1.1.jar。然而,当我试图传递内联字符串时。我的内联字符串如下:{“events”:[{“url”:“/操纵多云国家”,“visitorId”:“03c0b5e0-3eeb-382a-8c6d-35e4bb189cf6”,“timestamp