web-dev-qa-db-ja.com

ノードjsのresponse.sendとresponse.writeの違い

Node js "restify"フレームワークを使用する小さなAPIを作成しました。このAPIはリクエスト(実際には "/"の後のもの)を受信し、そのリクエストを別のサーバーに送信します。サーバーから応答を取得し、元の要求ソースに応答を返します。このAPIには、restifyサーバーとクライアントの両方を使用しています。

以下は、理解を深めるためのAPIコードです。

var apiServer = require('apiServer');
apiServer.start();

var restify = require('restify');
var assert = require('assert');

function onRequest(request, response, next)
{
    var client = restify.createStringClient({ 
        url: 'http://example.com'
    });

    client.get('/' + request.params[0], function(err, req, res, data) {
        assert.ifError(err);

        response.setHeader('Content-Type', 'text/html');
        response.writeHead(res.statusCode);
        response.write(data);
        response.end();
    });
    next();
}

function start()
{
    var server = restify.createServer();
    server.get(/^\/(.*)/, onRequest);
    server.listen(8888);

    console.log("Server has started.");
}

exports.start = start;

ここで、Node.jsのresponse.writeresponse.sendの違いを知る必要があります。 response.writeを使用すると、ヘッダーを設定して書き込むことができますが、response.sendを使用する場合、ヘッダーを使用して何もすることができません。 setHeader()またはwriteHeader()response.sendを使用すると、次のエラーが表示されます。

http.js:691 
 throw new Error( '送信後にヘッダーを設定できません。'); 
 ^ 
エラー:ヘッダーは設定できません。送信されました。

別のこともあります。 response.send()を使用すると、次のような完全なHTML出力が画面に表示されます。

<!DOCTYPE html>\n<html>\n\t<head></head></html> ..... "bla bla bla"

しかし、response.writeを使用すると、画面にはhtmlが表示されず、テキスト"bla bla bla"のみが表示されます。

誰かが私に違いを説明することができれば素晴らしいことです。

53
user3275959

docsresponse.send()が見つかりませんが、.send()が入力して応答を送信するので、.write()は1回しか呼び出せないと想定します応答を記述するだけですが、response.end()を使用して送信する必要があります

これは、応答がまだ送信されていないため、.write()を使用してヘッダーを編集できることを意味します。

編集

response.send()Response APIラッパーの再指定 の一部です

35
Jim Jeffries

response.send(msg)response.write(msg);response.end();と等しい

つまり、sendは1回しか呼び出すことができず、writeは何度も呼び出すことができますが、endは自分で呼び出す必要があります。

62
Flying Fisher

res.send()は、純粋なNode.jsではなくExpress.jsの一部です。

ただの傍観。私のアプリは時々非常に大きなJsonオブジェクト(HighChart 100kポイント以上を含むオブジェクト)を送り返します。 res.send()を使用すると、サーバーがハングアップして停止する場合がありますが、res.write()およびres.end()は問題なく処理します。

また、res.send()が呼び出されたときにメモリスパイクに気づきました。

29
Gäng Tian

Res.send(data)とres.write(data)を使用して、httpで巨大なテキストデータ(295mb)を送信しようとしていました。 res.send(data)はres.write(data)よりも遅いことに気付きました。次のことを観察しました。

res.send(data):一度だけ呼び出すことができ、あるバッファサイズのチャンクでデータをクライアントに送信し、再び戻って別のバッファサイズのチャンクを送信するので、前後のhttp通信。

res.write(data): res.end()に続いて複数回呼び出すことができ、データ全体に基づいてバッファサイズを作成し、http経由で送信するため、大量の場合に高速になりますデータの。

1
Shashi3456643