http.createServer中的request.on(function(request,response){});

时间:2016-05-07 21:00:13

标签: node.js node.js-stream

memcpy(ssl_session->client_random.data, payload[cs_id], 32);

我对上面的代码有两个问题。首先,我阅读了请求的文档,它说请求是IncomingMessage的一个实例,它实现了Readable Stream。但是,我无法在Stream文档中找到.on方法。所以我不知道request.on中的回调函数中有什么块。其次,我想对请求中的数据进行一些操作并将其传递给响应。我应该从大块管道还是从请求管道?谢谢你的考虑!

2 个答案:

答案 0 :(得分:0)

所有Streams都是EventEmitterdocs)的实例,这是.on方法的来源。

关于第二个问题,你必须从Stream对象管道(在这种情况下为request)。 "data"事件将数据作为BufferString(事件侦听器中的"chunk"参数)发出,而不是流。

操纵流通常是通过实施Transform流(docs)来完成的。尽管有许多NPM软件包可以使这个过程更简单(例如through2-map等),但实际上它们会产生Transform个流。

请考虑以下事项:

    var http = require('http');

    var map = require('through2-map');

    // Transform Stream to uppercase
    var uc = map(function(ch) {    
      return ch.toString().toUpperCase();  
    });

    var server = http.createServer(function(request, response) {
      // Pipe from the request to our transform stream
      request
        .pipe(uc)
        // pipe from transfrom stream to response
        .pipe(response);
    });
    server.listen(8000);

您可以通过运行curl来测试:

$ curl -X POST -d 'foo=bar' http://localhost:8000
# logs FOO=BAR

答案 1 :(得分:0)

  

是一个流吗?

NOP。流是整个数据块发送的流之间的流。 一个简单的例子,如果您读取1gb文件,流将以10k的块读取它,每个块将以正确的顺序从开始到结束通过您的流。 我使用文件作为示例,但是套接字,请求或任何流都基于该想法。

  

此外,每当有人向此服务器发送请求时,整个事情都会成为一块?

在http请求的特定情况下,只有请求正文是一个流。它可以是发布的文件/数据。或响应的响应主体。在将正文写入套接字之前,标题被视为要在请求上应用的对象。

一个帮助您了解具体代码的小例子,

var through2 = require('through2');

var Readable = require('stream').Readable;

var s1 = through2(function transform(chunk, enc, cb){
  console.log("s1 chunk %s", chunk.toString())
  cb(err=null, chunk.toString()+chunk.toString() )
});

var s2 = through2(function transform(chunk, enc, cb){
  console.log("s2 chunk %s", chunk.toString())
  cb(err=null, chunk)
});

s2.on('data', function (data) {
  console.log("s2 data %s", data.toString())
})

s1.on('end', function (data) {
  console.log("s1 end")
})

s2.on('end', function (data) {
  console.log("s2 end")
})

var rs = new Readable;
rs.push('beep '); // this is a chunk
rs.push('boop'); // this is a chunk
rs.push(null); // this is a signal to end the stream

rs.on('end', function (data) {
  console.log("rs end")
})

console.log(
  ".pipe always return piped stream: %s", rs.pipe(s1)===s1
)

s1.pipe(s2)

我建议你阅读更多内容: