如何捕获 `forFeature` 或 `forRoot` 中抛出的 NestJS 异常?

问题描述 投票:0回答:1

我按照 NestJS 文档中的描述设置了配置验证:https://docs.nestjs.com/techniques/configuration#schema-validation

验证按预期工作,但是当我的

.env
文件无效时,我收到简单的错误,例如:

错误:配置验证错误:需要“FOO_BAR” 在 Function.forRoot (

<PATH>\@nestjs\config\dist\config.module.js:44:27
)

此错误不是由 Nest 引发的,因此使用

globalFilter
可以捕获每个 Nest 错误的方法不起作用: https://docs.nestjs.com/websockets/exception-filters#exception-filters

如何捕获此错误以便能够对其进行格式化?

编辑:这是更普遍的问题:如何捕获 NestJS 中

forRoot, forFeature
中抛出的错误?

javascript node.js typescript nestjs nestjs-config
1个回答
0
投票

这是不可能的。因为 NestJS 会在模块初始化时捕获所有错误并进行处理,除了诸如

onModuleInit
之类的函数之外。您从终端看到的错误实际上就像
console.log
一样。这是文件句柄,并在模块初始化时显示日志错误ExceptionHandler

import { RuntimeException } from './exceptions/runtime.exception';
import { Logger } from '@nestjs/common/services/logger.service';

export class ExceptionHandler {
  private static readonly logger = new Logger(ExceptionHandler.name);

  public handle(exception: RuntimeException | Error) {
    if (!(exception instanceof RuntimeException)) {
      ExceptionHandler.logger.error(exception.message, exception.stack);
      return;
    }
    ExceptionHandler.logger.error(exception.what(), exception.stack);
  }
}

它不是从

Error
扩展的,并且不会重新抛出新的异常。

因此,您无法捕获

forRoot
forFeature
内的错误。但正如你所看到的,因为它正在记录,所以你可以覆盖 Nestjs 中的记录器,捕获你需要格式的错误消息。这种方式可能有点傻。

...
import { LoggerService, LogLevel } from '@nestjs/common/services/logger.service';
// Add custom logger
class CLogger implements LoggerService {
  log(message: any, ...optionalParams: any[]) {
    console.log(message);
  }
  error(message: any, ...optionalParams: any[]) {
    // check condition error at here
    console.error(message);
  }
  warn(message: any, ...optionalParams: any[]) {
    console.warn(message);
  }
  debug?(message: any, ...optionalParams: any[]) {
    console.debug(message);
  }
  verbose?(message: any, ...optionalParams: any[]) {
    console.debug(message);
  }
  fatal?(message: any, ...optionalParams: any[]) {
    console.debug(message);
  }
  setLogLevels?(levels: LogLevel[]) {
    // console.debug(message);
  }
}
// Import custom logger to NestJs at startup
...
    let app = await NestFactory.create(AppModule, {
      logger: new CLogger(),
    });
...
© www.soinside.com 2019 - 2024. All rights reserved.