configService.get <T>('key') завершается неудачно при приведении типа и joi при проверке - PullRequest
1 голос
/ 10 января 2020

Я создал пользовательский файл конфигурации для моего Nest Js REST API. Это простой пример для порта, который прослушивает приложение.

У меня есть файл .env с содержанием

SERVER_PORT = 3000

Пример моего файла конфигурации

import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import * as Joi from '@hapi/joi';

@Injectable()
export class ServerConfigService {
  constructor(private readonly configService: ConfigService) {
    const { error } = Joi.object({
      port: Joi.number()
        .port()
        .required(),
    }).validate({ port: this.port });

    if (error) { // no error thrown
      throw error;
    }

    console.log(typeof this.port); // type is string but should be number
  }

  public get port(): number {
    return this.configService.get<number>('SERVER_PORT');
  }
}

Я ожидаю, что тип порта будет number, но он все равно будет string. Итак, две вещи приходят мне на ум:

  • Я называю this.configService.get<T>('key'), как показано здесь с обобщенным типом c. Почему он все еще возвращает строку? Я ожидал бы приведение типа.
  • Я использую joi для проверки, как описано здесь . Я ожидаю, что joi выдаст ошибку.

Переменная порта может быть плохим примером, потому что Nest может работать с портом типа string. Но другие части ожидают числа и выдают ошибки, если переменная конфигурации должна быть числом, но имеет тип string.

Я что-то пропустил?

1 Ответ

2 голосов
/ 10 января 2020

Пример, который вы нашли с помощью ConfigService, вводит в заблуждение. Что вводит в заблуждение, так это параметр типа c. Тип, который вы передаете, влияет только на то, как возвращается значение. Фактический тип времени выполнения будет таким, какой он был при чтении.

Гнездо Js использует dotenv для чтения файлов конфигурации, и все значения просто читаются как строки. Преобразования не выполняются.

Вы должны использовать его следующим образом:

public get port(): number {
  return +this.configService.get('SERVER_PORT');
}

Источник ConfigService
источник потенциалов

...