我按照 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
中抛出的错误?
这是不可能的。因为 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(),
});
...