web-dev-qa-db-ja.com

Expressのres.sendとres.writeの違いは何ですか?

私はexpress.jsの初心者であり、res.sendres.writeの違いを理解しようとしていますか?

27
PG1

res.send

  • res.sendはExpress jsでのみ使用できます。
  • 単純な非ストリーミング応答に対して多くの有用なタスクを実行します。
  • Content-Length HTTP応答ヘッダーフィールドを自動的に割り当てる機能。
  • 自動HEADおよびHTTPキャッシュ鮮度サポートを提供する機能。
  • 実用的な説明

    • res.sendres.write + res.end()と同等であるため、一度しか呼び出すことができません
    • app.get('/user/:id', function (req, res) {
          res.send('OK');
      });
      

詳細については expressjs.com/en/api.html


res.write

  • 体の連続した部分を提供するために複数回呼び出すことができます。
  • response.write('<html>');
    response.write('<body>');
    response.write('<h1>Hello, World!</h1>');
    response.write('</body>');
    response.write('</html>');
    response.end();
    

詳細については
nodejs.org/docs
nodejs.org/en/docs/guides

55
Omal Perera

res.sendres.write + res.endと同等です。そのため、重要な違いはres.sendが複数回呼び出され、その後にres.writeが続くのに対して、res.endは1回しか呼び出せません。

ただし、res.sendはExpressの一部です。応答ヘッダーの長さを自動的に検出できます。ただし、res.send()でメモリスパイクが発生する可能性があります。大きなファイルの場合、アプリケーションはその間にハングアップします。

6
Keerti

最も重要な違いの1つどの回答にも「排水」と示されていない。

res.writeはtrueまたはfalseを返す場合があります。ドキュメントの時点で:

データ全体がカーネルバッファに正常にフラッシュされた場合、trueを返します。データの全部または一部がユーザーメモリのキューにある場合、falseを返します。バッファが再び解放されると、「ドレイン」が発行されます。

そのため、res.writeを実行する場合、res.writeがfalseを返した場合、ドレインイベントが発生するまで呼び出し元は書き込みを保留する必要があります。

これらはすべてres.sendで自動的に処理されます。トレードオフは、後者を使用するときに行う必要があるバッファリングです。

3
Charlie