从 node.js 的 http.IncomingMessage 获取请求 body

Get request body from node.js's http.IncomingMessage

我正在尝试为用 node.js 编写的应用程序实现一个简单的 HTTP 端点。我已经创建了 HTTP 服务器,但现在我一直在阅读请求内容 body:

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和header打印正确,但是r.read()总是NULL。我可以说请求的方式不是问题,因为 content-length header 在服务器端大于零。

Documentation says r 是一个 http.IncomingMessage object 实现了 Readable Stream 接口,为什么它不起作用?

好的,我想我已经找到了解决方案。 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);

'readable' 事件是错误的,它错误地在正文字符串的末尾添加了一个额外的空字符

使用 '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);