Wie erkenne ich den ursprünglichen Fehler im NestJS-Microservices-Framework?
Posted: 20 Jan 2025, 13:01
Ich verwende das NestJS-Microservices-Paket ClientProxy mit RabbitMQ als Transporter. Ich versuche, eine Nachricht vom Authentifizierungsdienst an den Benutzerdienst zu senden. Der Authentifizierungsdienst fragt den Benutzerdienst, ob ein Benutzer vorhanden ist. Ist dies nicht der Fall, fordert er den Benutzerdienst auf, einen Benutzer zu erstellen. Mein Code funktioniert, aber ich habe Schwierigkeiten, den Fehler zu extrahieren, der im Benutzer-Repository ausgegeben wird, wenn bereits ein Benutzer vorhanden ist. Ich erhalte in der Antwort einen 500-Fehler und obwohl das funktioniert, verstehe ich nicht, wo ich meinen ursprünglichen Fehler verliere. Ich muss mir einige Muster ausdenken, da dies eine normale Sache sein wird. Ich hatte wenig Erfolg bei der Durchsicht der NestJS-Dokumentation. Ihre Beispiele deklarieren keine Rückgabetypen für die Funktionen, daher konnte ich keine vollständigen Arbeitsbeispiele sehen. Die einzige Möglichkeit, einige der Typescript-Fehler bei der Rückgabe des Werts einer Funktion, die ein Observable aufruft, zu beheben, bestand darin, die Antwort in ein Versprechen zu verpacken. Scheint allerdings ein Hack zu sein.
Jede Hilfe wäre dankbar. Vielen Dank im Voraus.
Auth-Microservice-Dienst sendet Ereignis an Benutzer-Microservice:
Es wird zunächst gefragt, ob die E-Mail-Adresse des Benutzers vorhanden ist und wirft einen Fehler. Ich schaffe es nicht, dass dieser Fehler in der Antwort auftaucht.
Benutzercontroller wartet auf Ereignis:
Vom Controller aufgerufene Benutzerdienstmethode:
Vom Dienst aufgerufenes Benutzer-Repository:
Hier gebe ich den Fehler aus. Dieser Fehler ist in der resultierenden Observable nicht zu sehen, wo all dies beginnt. Die Fehlermethode im Observable weiß, dass ein Fehler aufgetreten ist, gibt mir aber ein leeres Objekt {}
Jede Hilfe wäre dankbar. Vielen Dank im Voraus.
Auth-Microservice-Dienst sendet Ereignis an Benutzer-Microservice:
Es wird zunächst gefragt, ob die E-Mail-Adresse des Benutzers vorhanden ist und wirft einen Fehler. Ich schaffe es nicht, dass dieser Fehler in der Antwort auftaucht.
Code: Select all
public async register({
dto,
}: {
dto: UserRequestDto;
}): Promise {
return new Promise((resolve, reject) => {
this.usersController
.send(FIND_USER_BY_EMAIL, dto.email)
.pipe(
switchMap((res) => {
if (res === null) {
return this.usersController.send(CREATE_USER, dto);
}
}),
)
.subscribe({
next: (res) => {
resolve(res);
},
error: (e) => {
reject(e);
},
});
});
}
Code: Select all
@MessagePattern(FIND_USER_BY_EMAIL)
@Serialize(UserResponseDto)
public async findByEmail(@Payload() email: string): Promise {
try {
return await this.usersService.findByEmail({ email: email });
} catch (e) {
throw e;
}
}
Code: Select all
public async findByEmail({ email }: { email: string }): Promise {
try {
return await this.usersRepository.findByEmail({ email: email });
} catch (e) {
throw e;
}
}
Hier gebe ich den Fehler aus. Dieser Fehler ist in der resultierenden Observable nicht zu sehen, wo all dies beginnt. Die Fehlermethode im Observable weiß, dass ein Fehler aufgetreten ist, gibt mir aber ein leeres Objekt {}
Code: Select all
public async findByEmail({ email }: { email: string }): Promise {
const repository = this.getRepository(UserEntity);
try {
const user = await repository.findOneBy({ email: email });
if (user) {
throw new UnprocessableEntityException("Email already exists.");
}
return user;
} catch (e) {
throw e;
}
}