web-dev-qa-db-ja.com

node.jsのhttp.IncomingMessageからリクエスト本文を取得します

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_オブジェクトですが、なぜ機能しないのですか?

11
lorenzo-s

わかりました、私は解決策を見つけたと思います。 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);
15
lorenzo-s

「読み取り可能」イベントが間違っています。本文文字列の末尾に余分なヌル文字が誤って追加されます

'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); 
6
BigMan73