从node.js的http.IncomingMessage获取请求正文

问题描述 投票:8回答:2

我正在尝试为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头在服务器端大于零。

Documentation says r是一个实现可读流接口的http.IncomingMessage对象,为什么它不起作用?

node.js httprequest httpserver
2个回答
13
投票

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

3
投票

'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); 
© www.soinside.com 2019 - 2024. All rights reserved.