GOOGLE ADS

Montag, 25. April 2022

Try catch block fängt den Fehler in node.js nicht ab

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 throwdarin 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 awaitso, wenn abgelehnt signUp()wird, geht das Versprechen in result, aber niemand kümmert sich jemals darum, dass das Versprechen abgelehnt wird und Sie UnhandlePromiseRejectionWarningaus 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 throwwird synchron sein (anstatt in ein abgelehntes Versprechen umgewandelt zu werden) und Sie try/catchwerden es dann fangen.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...