Разница между res.send и res.json в Express.js

201

Какова реальная разница между ними res.sendи тем, res.jsonчто оба выполняют одну и ту же операцию ответа клиенту.

пеленг
источник
73
Найдите минутку, чтобы заметить, как люди, публикующие ответы, просто пошли на github и прочитали исходный код. Это хорошая привычка учиться и устанавливать. Истина лежит в Источнике.
Питер Лайонс
31
@PeterLyons Я согласен, что это хорошая привычка, но вы имели в виду, что баран должен был смотреть на источник, а не задавать вопрос? Разве это не противоречит цели этого сайта? Наличие этого вопроса с ответами, ссылающимися на хороший источник (The Source!), Полезно.
LinusR
3
Да научи человека ловить рыбу и все.
Питер Лайонс
72
Когда нам говорят «RTFS» (Read The Source), это фактически означает, что документы не могут сообщить, что им нужно. Да, наличие источника позволяет нам проверить это, но не нужно добираться до него, кроме как в неясных случаях. Все эти экспресс-функции действительно хороши, но документы не дотягивают. ТАК полон вопросов о вещах Express, которые люди не могут понять из документов (случается со мной).
Хуан Ланус
3
Иногда чтение источника не является достаточным, и поскольку ответы могут дать хорошее объяснение, это обеспечит лучшее понимание вовлеченной концепции. Некоторые люди просто читают источник и понимают, но как насчет новичков, которые не обязательно дружественны к JavaScript? Подумай об этом.
cram2208

Ответы:

211

Методы идентичны при передаче объекта или массива, но 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()методе, которого метод send не имеет:

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

Метод заканчивается как a res.send()в конце:

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

return this.send(body);
hexacyanide
источник
16

Просматривая отправленные заголовки ...
res.send использует тип контента: text / html
res.json использует тип контента: приложение / json

Роджер Хиткот
источник
0

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

Это вернет номер JSON.

res.json(100)

Это вернет код состояния и выдаст предупреждение для использования sendStatus.

res.send(100)

Если ваш аргумент не является объектом или массивом JSON (null, undefined, boolean, string), и вы хотите, чтобы он был отправлен как JSON, используйте res.json.

Стивен Спунгин
источник