【问题标题】:Get request body from node.js's http.IncomingMessage从 node.js 的 http.IncomingMessage 获取请求正文
【发布时间】:2015-09-09 11:37:14
【问题描述】:

我正在尝试为用 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 是一个实现 Readable Stream 接口的http.IncomingMessage 对象,为什么它不起作用?

【问题讨论】:

    标签: node.js httprequest httpserver


    【解决方案1】:

    “可读”事件错误,它错误地在正文字符串的末尾添加了一个额外的空字符

    使用“数据”事件处理带有块的流:

    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); 
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 它不仅是一种异步方法,而且是事件驱动的。您可以有效地使用函数进行操作,并且可以将它们作为一等函数传递,并且可以使用闭包(匿名函数),这一事实使得这种方法成为 javascript 中最重要的编程方法。无论如何,我更喜欢r.on("data",function(chunk)),您可以直接使用读取的数据。与readable 相比,data 表示已从流中读取某些内容,而不是可以读取某些内容。无论如何,这是 io 的首选方式。
      • @BigMan73 是正确的 - 这将在正文字符串的末尾添加一个空值。看看他的回答吧。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2013-09-13
      • 1970-01-01
      • 2017-02-23
      • 2011-12-27
      • 2014-06-14
      相关资源
      最近更新 更多