memcpy(ssl_session->client_random.data, payload[cs_id], 32);
我对上面的代码有两个问题。首先,我阅读了请求的文档,它说请求是IncomingMessage的一个实例,它实现了Readable Stream。但是,我无法在Stream文档中找到.on方法。所以我不知道request.on中的回调函数中有什么块。其次,我想对请求中的数据进行一些操作并将其传递给响应。我应该从大块管道还是从请求管道?谢谢你的考虑!
答案 0 :(得分:0)
所有Streams都是EventEmitter
(docs)的实例,这是.on
方法的来源。
关于第二个问题,你必须从Stream对象管道(在这种情况下为request
)。 "data"
事件将数据作为Buffer
或String
(事件侦听器中的"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)
我建议你阅读更多内容: