Яка різниця між res.end () та res.send ()?


141

Я початківець у, Express.jsі мене бентежать ці два ключові слова: res.end()і res.send().

Вони однакові чи різні?


1
Я думаю, що res.endвикористовується звичайним вузлом, де як res.sendвикористовується експрес framwork
Muhammad Umer Idreesi

Відповіді:


130

res.send()відправить відповідь HTTP. Його синтаксис:

res.send([body])

Параметр body може бути об'єктом Buffer, String, об'єктом або масивом. Наприклад:

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();

Прочитайте це для отримання додаткової інформації.


68
Але res.end може насправді діяти як res.send, оскільки ви можете передавати рядовий аргумент, який потрібно додати як орган відповіді. Крім того, res.send також закінчує відповідь. То як вони функціонально відрізняються?
saltthehash

31
@ psytech140 Jmar77 отримав приємну відповідь тут : "Якщо ви передаєте рядок до res.send (), він автоматично передбачає Content-Type html. res.end (), однак просто викликає реалізацію нижнього кінця () вузла на потік відповідей, тому припущення щодо типу вмісту не робиться. "
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 (), ви можете відповідати лише текстом, і він не встановить " Тип вмісту "

      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-відповіді та закриття зв'язку. Ми бачимо код тут

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