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.write
とresponse.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"
のみが表示されます。
誰かが私に違いを説明することができれば素晴らしいことです。
docs でresponse.send()
が見つかりませんが、.send()
が入力して応答を送信するので、.write()
は1回しか呼び出せないと想定します応答を記述するだけですが、response.end()
を使用して送信する必要があります
これは、応答がまだ送信されていないため、.write()
を使用してヘッダーを編集できることを意味します。
編集:
response.send()
は Response APIラッパーの再指定 の一部です
response.send(msg)
はresponse.write(msg);response.end();
と等しい
つまり、send
は1回しか呼び出すことができず、write
は何度も呼び出すことができますが、end
は自分で呼び出す必要があります。
res.send()
は、純粋なNode.jsではなくExpress.jsの一部です。
ただの傍観。私のアプリは時々非常に大きなJsonオブジェクト(HighChart 100kポイント以上を含むオブジェクト)を送り返します。 res.send()
を使用すると、サーバーがハングアップして停止する場合がありますが、res.write()
およびres.end()
は問題なく処理します。
また、res.send()
が呼び出されたときにメモリスパイクに気づきました。
Res.send(data)とres.write(data)を使用して、httpで巨大なテキストデータ(295mb)を送信しようとしていました。 res.send(data)はres.write(data)よりも遅いことに気付きました。次のことを観察しました。
res.send(data):一度だけ呼び出すことができ、あるバッファサイズのチャンクでデータをクライアントに送信し、再び戻って別のバッファサイズのチャンクを送信するので、前後のhttp通信。
res.write(data): res.end()に続いて複数回呼び出すことができ、データ全体に基づいてバッファサイズを作成し、http経由で送信するため、大量の場合に高速になりますデータの。