Почему опция useFactory вызывает ошибку в конфигурации nestjs? - PullRequest
0 голосов
/ 25 сентября 2019

Тип '(configService: ConfigService) => Обещание <{тип: строка;порт: строка;имя пользователя: строка;пароль: строка;база данных: строка;хост: строка;лица: строка [];синхронизировать: логическое;}> 'нельзя назначить типу' (... args: any []) => ({retryAttempts ?: number; retryDelay ?: number; keepConnectionAlive ?: boolean;} & Partial) |({retryAttempts ?: номер; retryDelay ?: номер; keepConnectionAlive ?: boolean;} & Partial <...>) |... еще 11 ... |Promise <...>».Тип 'Обещание <{тип: строка;порт: строка;имя пользователя: строка;пароль: строка;база данных: строка;хост: строка;лица: строка [];синхронизировать: логическое;}> 'нельзя назначить типу' ({retryAttempts ?: номер; retryDelay ?: номер; keepConnectionAlive ?: boolean;} & Partial) |({retryAttempts ?: номер; retryDelay ?: номер; keepConnectionAlive ?: boolean;} & Partial <...>) |... еще 11 ... |Promise <...>».Тип 'Обещание <{тип: строка;порт: строка;имя пользователя: строка;пароль: строка;база данных: строка;хост: строка;лица: строка [];синхронизировать: логическое;}> 'нельзя присвоить типу «Обещание».Тип '{тип: строка;порт: строка;имя пользователя: строка;пароль: строка;база данных: строка;хост: строка;лица: строка [];синхронизировать: логическое;} 'нельзя назначить типу TypeOrmModuleOptions.Тип '{тип: строка;порт: строка;имя пользователя: строка;пароль: строка;база данных: строка;хост: строка;лица: строка [];синхронизировать: логическое;} 'нельзя назначить для типа' {retryAttempts ?: number;retryDelay ?: номер;keepConnectionAlive ?: логическое значение;} & Частично '.Тип '{тип: строка;порт: строка;имя пользователя: строка;пароль: строка;база данных: строка;хост: строка;лица: строка [];синхронизировать: логическое;} 'нельзя назначить типу' 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 / 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 Ответ

0 голосов
/ 25 сентября 2019

Так что проблема в том, что когда я пытаюсь получить PORT из файла .env, необходимо преобразовать тип в Number.Пример:

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,
}),

, который решает проблему

...