Node.js http.createServer中的request.on(函数(请求,响应){});

Node.js http.createServer中的request.on(函数(请求,响应){});,node.js,node.js-stream,Node.js,Node.js Stream,关于上面的代码,我有两个问题。首先,我阅读了request的文档,它说request是IncomingMessage的一个实例,它实现了可读流。但是,我在流文档中找不到.on方法。所以我不知道request.on中回调函数的块是什么。其次,我想对来自请求的数据进行一些操作,并将其通过管道传输到响应。我应该从chunk还是从request进行管道传输?谢谢你的考虑 所有流都是EventEmitter()的实例,这就是.on方法的来源 关于第二个问题,您必须从流对象(在本例中为request)进行管

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

所有流都是
EventEmitter
()的实例,这就是
.on
方法的来源

关于第二个问题,您必须从流对象(在本例中为
request
)进行管道传输。
“data”
事件以
缓冲区或
字符串(事件侦听器中的
“chunk”
参数)而不是流的形式发出数据

操作流通常通过实现
转换
流()来完成。尽管有许多NPM软件包可以简化此过程(如
through2map
等),但实际上,它们会生成
Transform

考虑以下几点:

var http = require('http');

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

uc = map(function(ch) {    
  return ch.toString().toUpperCase();  
});

server = http.createServer(function(request, response) {
  request.on('data',function(chunk){
      if (request.method == 'POST') {
         //change the data from request to uppercase letters and 
         //pipe to response. 
      }
    });
});
server.listen(8000);
您可以通过运行curl进行测试:

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

所有流都是
EventEmitter
()的实例,这就是
.on
方法的来源

关于第二个问题,您必须从流对象(在本例中为
request
)进行管道传输。
“data”
事件以
缓冲区或
字符串(事件侦听器中的
“chunk”
参数)而不是流的形式发出数据

操作流通常通过实现
转换
流()来完成。尽管有许多NPM软件包可以简化此过程(如
through2map
等),但实际上,它们会生成
Transform

考虑以下几点:

var http = require('http');

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

uc = map(function(ch) {    
  return ch.toString().toUpperCase();  
});

server = http.createServer(function(request, response) {
  request.on('data',function(chunk){
      if (request.method == 'POST') {
         //change the data from request to uppercase letters and 
         //pipe to response. 
      }
    });
});
server.listen(8000);
您可以通过运行curl进行测试:

    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);
这是一条小溪吗

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

而且,每当有人向这个服务器发送请求时,整个内容会是一个块吗

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

这是一个小示例,可以帮助您编写一些具体的代码

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

我建议你多读一些:

这是一条小溪吗

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

而且,每当有人向这个服务器发送请求时,整个内容会是一个块吗

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

这是一个小示例,可以帮助您编写一些具体的代码

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

我建议你多读一些:


关于
但是,我在流文档中找不到.on方法。
这是因为流实现了EventEmitter(文档说
所有流都是EventEmitter
)。您必须在上检查此特定方法。否则我就不明白你的问题了。基本上,您应该通过管道将请求流传输到响应流中。流由从一端写入另一端的数据块组成。数据块是流吗?而且,每当有人向这个服务器发送请求时,整个内容会是一个块吗?如果两个人发送两个请求,那会是两个块吗?关于
,但是,我在流文档中找不到.on方法。
这是因为流实现了EventEmitter(文档说
所有流都是EventEmitter
)。您必须在上检查此特定方法。否则我就不明白你的问题了。基本上,您应该通过管道将请求流传输到响应流中。流由从一端写入另一端的数据块组成。数据块是流吗?而且,每当有人向这个服务器发送请求时,整个内容会是一个块吗?如果两个人发送两个请求,那会是两块吗?