Bawię się z Nodejsem i wyrażam, budując API małego odpoczynku. Moje pytanie brzmi: jaka jest dobra praktyka / najlepszy sposób na ustawienie statusu kodu, a także danych odpowiedzi?
Pozwól, że wyjaśnię trochę kodu (nie umieszczę węzła i kodu ekspresowego niezbędnego do uruchomienia serwera, tylko metody routera, których to dotyczy):
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
res.json(user);
});
exports.getUserById = function(id) {
for (var i = 0; i < users.length; i++) {
if (users[i].id == id) return users[i];
}
};
Poniższy kod działa idealnie, a wysyłając zapytanie za pomocą Postmana, otrzymuję następujący wynik:
Jak widać, status pokazuje 200, co jest OK. Ale czy to najlepszy sposób, aby to zrobić? Czy istnieje przypadek, w którym powinienem sam ustawić status, a także zwrócony JSON? Czy zawsze jest to obsługiwane przez ekspres?
Na przykład właśnie wykonałem szybki test i nieznacznie zmodyfikowałem powyższą metodę get:
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
if (user == null || user == 'undefined') {
res.status(404);
}
res.json(user);
});
Jak widać, jeśli użytkownika nie ma w tablicy, ustawię tylko status 404.
Zasoby / porady, aby dowiedzieć się więcej na ten temat, są mile widziane.
Odpowiedzi:
Dokumentacja Express API dotyczy tej sprawy.
Zobacz status i wyślij .
Krótko mówiąc, wystarczy wywołać
status
metodę przed wywołaniemjson
lubsend
:źródło
res.sendStatus(400);
res.sendStatus(400);
przesyła ciąg danych, jest to odpowiednikres.status(400).send('Not Found')
Możesz to zrobić w ten sposób:
Spowoduje to ustawienie kodu statusu HTTP na 400, działa nawet w trybie ekspresowym 4.
źródło
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead
Wres.status(400).json(json_response)
dzisiejszych czasach byłoby to trafne.res.status(500).send({ error: "boo:(" });
status 200 będzie domyślnym podczas korzystania
res.send
,res.json
itpMożesz ustawić status jak
res.status(500).json({ error: 'something is wrong' });
Często zrobię coś takiego ...
Następnie niech moje oprogramowanie pośredniczące z błędem wyśle odpowiedź i zrobi wszystko, co muszę zrobić, gdy wystąpi błąd.
Dodatkowo:
res.sendStatus(status)
został dodany od wersji 4.9.0 http://expressjs.com/4x/api.html#res.sendStatusźródło
Lista kodów stanu HTTP
Dobrą praktyką dotyczącą odpowiedzi statusu jest, jak można przewidzieć, wysyłanie odpowiedniego kodu statusu HTTP w zależności od błędu (4xx dla błędów klienta, 5xx dla błędów serwera), w odniesieniu do faktycznej odpowiedzi JSON nie ma „biblii”, ale dobrym pomysłem może być wysłać (ponownie) status i dane jako 2 różne właściwości obiektu głównego w udanej odpowiedzi (w ten sposób dajesz klientowi szansę na przechwycenie statusu z nagłówków HTTP i samego ładunku) oraz trzecią właściwość wyjaśniającą błąd w sposób zrozumiały dla człowieka w przypadku błędu.
API Stripe zachowuje się podobnie w prawdziwym świecie.
to znaczy
dobrze
Błąd
źródło
Używam tego w mojej aplikacji Express.js:
źródło
Standardowy sposób uzyskania pełnej odpowiedzi HttpResponse, która obejmuje następujące właściwości
Na backend to zrobić
Na Frontend np. W
Angular
, po prostu wykonaj:źródło
źródło
źródło
Mógłbyś to zrobić
źródło
Najlepszym sposobem wysłania odpowiedzi na błąd byłoby
return res.status(400).send({ message: 'An error has occurred' })
.Następnie w swoim interfejsie możesz go złapać, używając czegoś takiego:
Po prostu rejestrowanie
err
nie będzie działać, ponieważ obiekt wysłanej wiadomości znajduje się w nimerr.response.data
.Mam nadzieję, że to pomaga!
źródło