Різниця між res.send та res.json в Express.js


200

Що фактична різниця між res.sendі і res.jsonяк здається, виконують ту ж операцію реагування на клієнта.


73
Знайдіть хвилину, щоб зауважити, як відповіді людей, які публікують, просто перейшли до Github та прочитали вихідний код. Це гарна звичка вчитися і встановлювати. Істина полягає у Джерелі.
Пітер Ліонс

31
@PeterLyons Я погоджуюсь, що це хороша звичка, але ти мав на увазі, що баран повинен був подивитися на джерело, а не задавати питання? Чи це не поразка цілі цього сайту? Наявність цього питання з відповідями, що посилаються на хороше джерело (Джерело!) Корисне.
LinusR

3
Так, навчіть людину ловити рибу і все.
Пітер Ліонс

71
Коли нам кажуть "RTFS" (Read the Source), це насправді означає, що документи не передають те, що повинні. Так, наявність джерела дозволяє нам перевірити його, але не потрібно потрапляти до нього, за винятком незрозумілих випадків. Усі ці функції Express - це справді чудово, але документи випадають дуже багато. Так багато питань щодо експрес-речей, які люди не можуть зрозуміти з документів (трапляється зі мною).
Хуан Ланус

3
Іноді джерела читання недостатньо, і оскільки з відповідей може виникнути хороше пояснення, це забезпечить найкраще розуміння відповідної концепції. Деякі люди просто читатимуть джерело та розуміють, але як бути з початківцями, які не обов'язково дружать JavaScript? Подумай над цим.
cram2208

Відповіді:


210

Методи ідентичні при передачі об'єкта або масиву, але res.json()також перетворять не об’єкти, такі як nullі undefined, які не є дійсними JSON.

Метод також використовує налаштування json replacerта json spacesпрограми, тож ви можете відформатувати JSON з додатковими параметрами. Ці параметри встановлені так:

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

І перейшло JSON.stringify()так:

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

Це код у res.json()методі, який у методі відправлення відсутній:

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

Метод в кінцевому підсумку закінчується як res.send():

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

return this.send(body);


16

Дивлячись у надіслані заголовки ...
res.send використовує тип вмісту: text / html
res.json використовує тип вмісту: application / json


0

res.jsonзмушує аргументувати JSON. res.sendвізьме не-json об’єкт або масив і надішле інший тип. Наприклад:

Це поверне номер JSON.

res.json(100)

Це поверне код статусу та видасть попередження про використання sendStatus.

res.send(100)

Якщо ваш аргумент не є об'єктом або масивом JSON (нульовим, невизначеним, булевим, рядковим), і ви хочете переконатися, що він надісланий як JSON, використовуйте res.json.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.