Meisterhaftes NestJS DMN: Hit Policies und fortgeschrittene Tricks (Teil 2)
Willkommen zurück! In Teil 1 haben wir @oltionzefi/nestjs-dmn vorgestellt, einen schlanken DMN 1.3 Parser und Evaluator für NestJS, der Sie nicht dazu zwingt, eine JVM hochzufahren, nur um ein paar Regeln auszuwerten.
Heute tauchen wir in die fortgeschrittenen Funktionen ein: Konfiguration, asynchrone Einrichtung und Erweiterung der Bibliothek, um sie nach Ihren Wünschen anzupassen.
Fortgeschrittene Konfiguration
Das Modul stellt eine forRoot()-Methode zur Verfügung, die ein Optionsobjekt akzeptiert. Hier passiert die Magie, wenn Sie bei Ihrer Anwendung streng sein wollen.
DmnModule.forRoot({
// Einschränken der akzeptierten Hit Policies.
// Wenn jemand eine DMN mit einer nicht unterstützten Policy hochlädt, werfen wir beim Parsen einen Fehler (einen Wutanfall).
supportedHitPolicies: ['FIRST', 'UNIQUE'],
// So dekodieren Sie den Text der Ausgabezelle:
// 'json' (Standard) parst als JSON, andernfalls roher Text
// 'raw' gibt immer den rohen String zurück
outputCellParser: 'json',
// So leiten Sie den Kontextschlüssel von einem DMN-Eingabelabel ab.
labelToVariableName: (label) => label.toLowerCase().replace(/\s+/g, '_'),
});
Benötigen Sie dies dynamisch? Verwenden Sie forRootAsync:
DmnModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
supportedHitPolicies: config.get('dmn.policies'),
}),
});
Erweiterung der Dienste
Eine der wichtigsten Designphilosophien dieses Pakets ist die Erweiterbarkeit. Jede Hilfsmethode von DmnParserService und DmnEvaluatorService ist protected. Das bedeutet, dass Sie Unterklassen erstellen und Ihr eigenes benutzerdefiniertes Verhalten injizieren können, ohne auf einen Pull Request warten zu müssen.
Nehmen wir zum Beispiel an, Sie möchten leere Eingabezellen in der Produktion explizit verbieten, weil Sie sich schon einmal mit leeren Fallbacks verbrannt haben:
import { Injectable } from '@nestjs/common';
import { DmnParserService } from '@oltionzefi/nestjs-dmn';
@Injectable()
export class StrictDmnParserService extends DmnParserService {
protected override parseInputCell(text: string | undefined): string {
const value = super.parseInputCell(text);
if (value === '-' && process.env.NODE_ENV === 'production') {
throw new Error('Leere Eingabezellen sind in produktiven DMN-Dateien nicht erlaubt. Wir führen hier ein strenges Regiment!');
}
return value;
}
}
Dann stellen Sie es einfach in Ihrem Modul bereit:
@Module({
imports: [DmnModule.forRoot()],
providers: [{ provide: DmnParserService, useClass: StrictDmnParserService }],
exports: [DmnParserService],
})
export class AppModule {}
Fehlerbehandlung, die nicht nervt
Niemand mag verschluckte Fehler. Wenn etwas fehlschlägt, enthalten alle geworfenen Fehler den ursprünglichen Fehler als cause (das standardmäßige ES2022-Feld Error.cause). Das bedeutet, dass Stack-Traces den Wrapper überleben und das Debugging etwas weniger schmerzhaft machen.
try {
await parser.parseDmnXml(brokenXml);
} catch (err) {
console.error(err.message, err.cause);
}
Zusammenfassung
Und da haben Sie es! Ein professioneller, sauberer und vollständig typisierter Weg, DMN-Dateien in Ihren NestJS-Anwendungen auszuwerten.
Es übernimmt die Logik, Sie übernehmen den Applaus. Gehen Sie jetzt und schreiben Sie ein paar Regeln!
