javascript - Hur fångar man NestJS-undantag som kastas i `forFeature` eller `forRoot`?
Jag satte upp konfigurationsvalidering som beskrivs i dokumentationen för NestJS: https://docs.nestjs.com/techniques/configuration#schema-validation
Validering fungerar som förväntat, men när min .env-fil inte är giltig får jag ett vanligt fel, till exempel:
Fel: Konfigurationsvalideringsfel: "FOO_BAR" krävs vid Function.forRoot (
<PATH>\@nestjs\config\dist\config.module.js:44:27)
Detta fel kastas inte av Nest så angreppssättet med globalFilter som kan fånga varje Nest-fel fungerar inte: https://docs.nestjs.com/websockets/exception-filters#exception-filters
Hur fångar man detta fel för att kunna formatera det?
REDIGERA: Detta är en mer allmän fråga: Hur fångar man fel som kastas inuti forRoot, forFeature i NestJS?
Svar #1
Detta är omöjligt. Eftersom NestJS fångar alla fel och hanterar dem när modulen initieras förutom funktioner som onModuleInit. Felet som du ser i terminalen är egentligen bara som console.log. Detta är filhantering och visar loggfel när modulen initieras 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);
}
}
Det är inte en utökning av Error och kastar inte om ett nytt undantag.
Så, du kan inte fånga fel inuti forRoot eller forFeature. Men som du ser, eftersom det loggar, kan du skriva över loggaren i Nestjs, fånga felmeddelandet som du behöver formatera. Det här sättet kan vara lite dumt.
...
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(),
});
...
