В чем разница между res.end () и res.send ()?

141

Я новичок, Express.jsи меня смущают эти два ключевых слова: res.end()и res.send().

Они одинаковые или разные?

sudheeshcm
источник
1
Я думаю, что res.endиспользуется простой узел, где res.sendиспользуется экспресс-фреймворк
Мухаммед Умер Идриси

Ответы:

130

res.send()отправит ответ HTTP. Его синтаксис:

res.send([body])

Параметр body может быть объектом Buffer, строкой, объектом или массивом. Например:

res.send(new Buffer('whoop'));
res.send({ some: 'json' });
res.send('<p>some html</p>');
res.status(404).send('Sorry, we cannot find that!');
res.status(500).send({ error: 'something blew up' });

Смотрите это для получения дополнительной информации.

res.end()завершит процесс ответа. Этот метод на самом деле происходит от ядра Node, а именно от response.end()метода http.ServerResponse. Он используется для быстрого завершения ответа без каких-либо данных. Например:

res.end();
res.status(404).end();

Прочитайте это для получения дополнительной информации.

itzmebibin
источник
69
Но res.end на самом деле может действовать как res.send, так как вы можете передать строковый аргумент для добавления в качестве тела ответа. Кроме того, res.send также завершает ответ. Так как они функционально отличаются?
Salthhehash
31
@ psytech140 Jmar77 был хороший ответ здесь : «Если вы передаете строку res.send (), он автоматически принимает тип содержимого HTML res.end (), однако, просто называет основной конец узла реализации () на. поток ответа, поэтому для Content-Type не делается никаких предположений. "
abagh0703
Пришлось высказывать это исключительно потому, что я никогда не использовал, expressно из заглавной мысли - кто-то что-то посылает, что-то заканчивает ... это правда.
Даррен Бартруп-Кук
Но что делать, если вы просто используете res.send()ничего? Это как res.end()?
CMCDragonkai
108

Я хотел бы сделать несколько больший акцент на некоторых ключевых различиях между res.end()& в res.send()отношении заголовков ответов и их важности.

1. res.send () проверит структуру вашего вывода и соответственно установит информацию заголовка.


    app.get('/',(req,res)=>{
       res.send('<b>hello</b>');
    });

введите описание изображения здесь


     app.get('/',(req,res)=>{
         res.send({msg:'hello'});
     });

введите описание изображения здесь

Где с помощью res.end () вы можете отвечать только текстом, и он не будет устанавливать « Content-Type »

      app.get('/',(req,res)=>{
           res.end('<b>hello</b>');
      }); 

введите описание изображения здесь

2. res.send () установит атрибут «ETag» в заголовке ответа

      app.get('/',(req,res)=>{
            res.send('<b>hello</b>');
      });

введите описание изображения здесь

¿Почему этот тег важен?
Заголовок ответа ETag HTTP является идентификатором для конкретной версии ресурса. Это позволяет кэшам быть более эффективными и экономит пропускную способность, поскольку веб-серверу не нужно отправлять полный ответ, если содержимое не изменилось.

res.end() НЕ будет устанавливать этот атрибут заголовка

Хорхе Гонсалес
источник
4
Это должен быть принятый ответ, по моему мнению ... больше внимания уделяется фактическим различиям, которые могут испортить ваш рабочий день, вместо обсуждения окончательного ответа с / без содержания ...
Томас
13

Что делает res.send (), так это реализует res.write , res.setHeaders и res.end .
он проверяет, какие данные вы отправляете, и устанавливает правильные заголовки,

затем его поток данных с помощью res.write, и в конце он использует res.end, чтобы установить конец запроса.

Есть некоторые случаи, когда вы захотите сделать это вручную, например, если вы хотите потоковый файл или большой набор данных, в этом случае вы захотите установить заголовки самостоятельно и использовать res.write, чтобы сохранить поток течь.

Амит Вагнер
источник
0

resявляется объектом HttpResponse, который происходит от OutgoingMessage. res.sendвызовы, res.endкоторые реализованы OutgoingMessage для отправки HTTP-ответа и закрытия соединения. Мы видим код здесь

пилон
источник