Node.jsで記述されたアプリケーションに単純なHTTPエンドポイントを実装しようとしています。 HTTPサーバーを作成しましたが、リクエストコンテンツの本文を読み続けることになりました。
_http.createServer(function(r, s) {
console.log(r.method, r.url, r.headers);
console.log(r.read());
s.write("OK");
s.end();
}).listen(42646);
_
リクエストのメソッド、URL、ヘッダーは正しく出力されますが、r.read()
は常にNULLです。サーバー側では_content-length
_ヘッダーがゼロより大きいため、リクエストの作成方法に問題はないと言えます。
ドキュメントによるとr
は読み取り可能なストリームインターフェイスを実装する_http.IncomingMessage
_オブジェクトですが、なぜ機能しないのですか?
わかりました、私は解決策を見つけたと思います。 r
ストリーム(node.jsの他のすべてのように、愚かな私...)は、非同期イベント駆動型の方法で読み取る必要があります。
http.createServer(function(r, s) {
console.log(r.method, r.url, r.headers);
var body = "";
r.on('readable', function() {
body += r.read();
});
r.on('end', function() {
console.log(body);
s.write("OK");
s.end();
});
}).listen(42646);
「読み取り可能」イベントが間違っています。本文文字列の末尾に余分なヌル文字が誤って追加されます
'data'イベントを使用してチャンクでストリームを処理します。
http.createServer((r, s) => {
console.log(r.method, r.url, r.headers);
let body = '';
r.on('data', (chunk) => {
body += chunk;
});
r.on('end', () => {
console.log(body);
s.write('OK');
s.end();
});
}).listen(42646);