← Wszystkie zadaniaNode.js · Junior
HttpError i bezpieczna odpowiedź
Napisz klasę HttpError (dziedziczy po Error, ma status i message) i funkcję toResponse(error) dla obsługi błędów serwera. Zwraca { status, body: { error } }.
Dla błędów klienta (HttpError ze statusem 4xx) komunikat jest pokazywany bez zmian. Wszystko inne - HttpError 5xx, zwykłe Error, a nawet rzucone napisy czy null - daje { error: "Internal Server Error" }: status 5xx zostaje, a dla czegokolwiek, co nie jest HttpError, to 500. Klient nie może widzieć wewnętrznych szczegółów, takich jak adresy baz danych.
Ctrl+Enter uruchamia testy. Tab robi wcięcie; aby wyjść z edytora klawiaturą, naciśnij Esc, a potem Tab. Kod zapisuje się w tej przeglądarce.
Testy (5)
const e = new HttpError(404, 'User not found'); expect(e).toBeInstanceOf(Error); expect(e).toBeInstanceOf(HttpError); expect(e.status).toBe(404); expect(e.message).toBe('User not found');
expect(toResponse(new HttpError(404, 'User not found'))).toEqual({ status: 404, body: { error: 'User not found' } }); expect(toResponse(new HttpError(422, 'Email is invalid'))).toEqual({ status: 422, body: { error: 'Email is invalid' } });
expect(toResponse(new Error('connect ECONNREFUSED 10.0.0.5:5432'))).toEqual({ status: 500, body: { error: 'Internal Server Error' } });
expect(toResponse(new HttpError(503, 'Redis is down at 10.0.0.7'))).toEqual({ status: 503, body: { error: 'Internal Server Error' } });
expect(toResponse('oops')).toEqual({ status: 500, body: { error: 'Internal Server Error' } }); expect(toResponse(null)).toEqual({ status: 500, body: { error: 'Internal Server Error' } });