class AuthController {
static methods = {
GET: {
'/auth/signup': {
func: AuthService.signUp,
response: (data, res) => {
res.statusCode = 200;
res.end(JSON.stringify(data));
},
},
},
};
static use(req, res) {
const route = this.methods[req.method][req.url];
if (!route) {
res.statusCode = 404;
res.end(JSON.stringify({ message: 'Not found 404!' }));
return;
}
try {
const data = JSON.parse(req?.body?.data || '{}');
const result = route.func({...data });
route.response(result, res);
} catch (err) {
console.log(err, 'here');
res.statusCode = err.statusCode || 500;
res.end(JSON.stringify(err.message));
}
}
}
class AuthService {
static async signUp({ login, password }) {
if (!login ||!password) throw new BaseError(400, 'kl', 'Custom error');
}
}
Es zeigt den Fehler in der Konsole an, aber try catch block sieht ihn nicht.
Hier ist die Rückverfolgung. Ich weiß nicht, was der Grund ist, weil sich die Funktion, die einen Fehler auslöst, innerhalb des Blocks befindet. Hilfe bitte!
Lösung des Problems
Ich sehe ein Problem. Sie haben erklärt signUp()
zu sein async
. Das bedeutet, dass es immer ein Versprechen zurückgibt und dass alle throw
darin enthaltenen Operationen dieses Versprechen ablehnen, das es zurückgibt (die Ausnahme wird nicht synchron weitergegeben). Aber wenn Sie versuchen, es hier anzurufen:
const result = route.func({...data });
Sie tun es nicht await
so, wenn abgelehnt signUp()
wird, geht das Versprechen in result
, aber niemand kümmert sich jemals darum, dass das Versprechen abgelehnt wird und Sie UnhandlePromiseRejectionWarning
aus dem System kommen.
Ich kann nicht das gesamte Gesamtdesign (aller anderen Routen) sehen, aber vielleicht müssen Sie nur Folgendes hinzufügen await
:
const result = await route.func({...data });
Und das müsstest du auch .use()
machen async
.
Oder, wenn signUp()
es eigentlich nicht sein muss async
, dann entfernen Sie einfach das async
aus seiner Deklaration und das throw
wird synchron sein (anstatt in ein abgelehntes Versprechen umgewandelt zu werden) und Sie try/catch
werden es dann fangen.
Keine Kommentare:
Kommentar veröffentlichen