res.end()とres.send()の違いは何ですか?


141

私は初心者ですが、Express.jsこれら2つのキーワード:res.end()とに混乱していres.send()ます。

それらは同じですか、それとも異なりますか?


1
エクスプレスフレームワークres.endで使用されるプレーンノードで使用されると思いますres.send
Muhammad Umer Idreesi

回答:


129

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()応答プロセスを終了します。この方法は、実際にノードコア、特にから来ているresponse.end()の方法http.ServerResponse。データなしで応答をすばやく終了するために使用されます。例えば:

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

詳細については、こちらをお読みください。


68
ただし、res.endは実際にはres.sendのように動作でき、文字列引数を渡して応答本文として追加できます。その上、res.sendは応答も終了します。それで、それらはどのように機能的に異なりますか?
saltthehash 2016年

31
@ psytech140 Jmar77はここで素晴らしい応答を返しました。「res.send()に文字列を渡すと、Content-Typeがhtmlであると自動的に想定されます。res.end()は、ノードの基になるend()実装を応答ストリームなので、Content-Typeは想定されていません。」
abagh0703

私が使用しexpressたことがないので、これを純粋に賛成しなければならなかったが、タイトルから考えた-1つは何かを送信し、1つは何かを終了する....
Darren Bartrup-Cook 2018

しかし、何も使わずに使用する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>');
      });

ここに画像の説明を入力してください

tagこのタグが重要なのはなぜですか?
ETag HTTP応答ヘッダーは、リソースの特定のバージョンの識別子です。コンテンツが変更されていない場合、Webサーバーは完全な応答を送信する必要がないため、キャッシュの効率が向上し、帯域幅が節約されます。

res.end() このヘッダー属性を設定しません


4
これは私の意見では受け入れられる回答です...内容の有無にかかわらず応答を終了することについての議論ではなく、作業日を台無しにする可能性のある実際の違いについてより多くの曖昧さが行われます...
Tomas

13

res.send()が行うことは、res.writeres.setHeaders、およびres.endを実装することです
送信するデータをチェックし、正しいヘッダーを設定します。

次に、res.writeを使用してデータをストリーミングし、最後にres.endを使用してリクエストの終了を設定します。

たとえば、ファイルまたは大きなデータセットをストリーミングしたい場合など、手動で実行したい場合があります。この場合、自分でヘッダーを設定し、ストリームを維持するためにres.writeを使用します。フロー。


0

resOutgoingMessageから拡張されるHttpResponseオブジェクトです。HTTP応答を送信して接続を閉じるためにOutgoingMessageによって実装されるres.send呼び出しres.endここにコードが表示されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.