Różnica między res.send i res.json w Express.js

200

Jaka jest rzeczywista różnica między res.sendi res.jsonponieważ oba wydają się wykonywać tę samą operację reagowania na klienta.

brg
źródło
73
Poświęć chwilę, aby zauważyć, jak ludzie publikujący odpowiedzi po prostu poszli do github i przeczytali kod źródłowy. To dobry nawyk do nauki i ustalania. Prawda leży w Źródle.
Peter Lyons,
31
@PeterLyons Zgadzam się, że to dobry nawyk, ale czy miałeś na myśli, że baran powinien spojrzeć na źródło zamiast zadawać pytanie? Czy to nie przeczy celowi tej witryny? Obecność tego pytania z odpowiedziami odnoszącymi się do dobrego źródła (The Source!) Jest przydatna.
LinusR
3
Tak, naucz człowieka łowić ryby i wszystko inne.
Peter Lyons,
71
Kiedy powiedziano nam „RTFS” (Read The Source), oznacza to, że doktorzy nie komunikują się, co powinni. Tak, posiadanie źródła pozwala nam to sprawdzić, ale nie trzeba się do niego dostać, z wyjątkiem mało znanych przypadków. Wszystkie te funkcje Express są naprawdę świetne, ale dokumenty są zdecydowanie za słabe. SO jest pełne pytań na temat Ekspresowych rzeczy, których ludzie nie rozumieją z dokumentów (zdarza mi się).
Juan Lanus
3
Czasami źródło czytania nie jest wystarczające, a ponieważ z odpowiedzi może wynikać dobre wyjaśnienie, zapewni to najlepsze zrozumienie związanej z tym koncepcji. Niektórzy po prostu czytają źródła i rozumieją, ale co z początkującymi, którzy niekoniecznie są przyjaźnie nastawieni do javascript? Pomyśl o tym.
cram2208

Odpowiedzi:

210

Metody są identyczne, gdy przekazywany jest obiekt lub tablica, ale res.json()będą także konwertować obiekty niebędące obiektami, takie jak nulli undefined, które nie są poprawnym JSON.

Metoda korzysta również z ustawień aplikacji json replaceri json spaces, dzięki czemu można sformatować JSON z większą liczbą opcji. Te opcje są ustawione tak:

app.set('json spaces', 2);
app.set('json replacer', replacer);

I przeszedł do JSON.stringify()podobnego:

JSON.stringify(value, replacer, spacing);
// value: object to format
// replacer: rules for transforming properties encountered during stringifying
// spacing: the number of spaces for indentation

To jest kod w res.json()metodzie, której nie ma metoda send:

var app = this.app;
var replacer = app.get('json replacer');
var spaces = app.get('json spaces');
var body = JSON.stringify(obj, replacer, spaces);

Metoda kończy się res.send()na końcu:

this.charset = this.charset || 'utf-8';
this.get('Content-Type') || this.set('Content-Type', 'application/json');

return this.send(body);
heksacyjanid
źródło
16


Sprawdzanie wysłanych nagłówków ... res.send używa content-type: text / html
res.json używa content-type: application / json

blok techniczny
źródło
0

res.jsonzmusza argument do JSON. res.sendweźmie obiekt lub tablicę inną niż json i wyśle ​​inny typ. Na przykład:

Zwróci to numer JSON.

res.json(100)

Zwróci kod statusu i wyświetli ostrzeżenie, aby użyć sendStatus.

res.send(100)

Jeśli twój argument nie jest obiektem lub tablicą JSON (null, undefined, boolean, string) i chcesz upewnić się, że jest wysyłany jako JSON, użyj res.json.

Steven Spungin
źródło