NodeJS通过流

时间:2016-02-25 00:46:09

标签: node.js

我目前正在尝试使用NodeJS流,并深入了解了在http.createServer请求处理程序的每个http请求中创建的http.ServerResponse对象。

我现在要做的是在另一个通过另一个任意方法连接的进程中使用http.ServerResponse对象的完全相同的API(例如使用Streams)并管道所有输出此对象(包括标题!)对于实际请求,如下所示:

-[http]-> server1 -[stream]-> server2 -[stream]-> server1 -[http]->

我尝试了几种变体,例如以下(仅限本地)示例:

var http = require('http');
var net = require('net');
var through = require('through');
var StreamWrap = require('_stream_wrap').StreamWrap;

http.createServer(function(req, _res) {

    var resStream = through();
    resStream.pipe(_res.socket);

    resStream.__proto__.cork = function() {};
    resStream.__proto__.uncork = function() {};

    var resSocket = new StreamWrap(resStream);
    var res = new http.ServerResponse(req);
    res.assignSocket(resSocket);

    res.writeHead(201, {'Content-Type': 'text/plain'});
    res.write('hello');
    res.end();

}).listen(8000, function() {
    console.log("Server listening");
});

本质上应该将原始HTTP消息发送到底层套接字(或不是?),但出于某种原因,我得到了Segmentation fault: 11 - 我也不确定我是否&#39 ; m正确使用StreamWrap对象。但我认为这不是最佳解决方案,因为ServerResponse对象在内部处理有关套接字的许多事情。

那么解决这个问题的最佳方法是什么?

如果我直接与响应对象进行管道连接,则只会写入HTTP正文(另请参阅this answer),并且我将丢失标头信息。那么最好将标题和正文分开,然后单独转移它们吗?我如何知道在ServerResponse对象上最终设置标题的时间,以及数据何时开始(除了尾随标题之外的其他选项)?

另一种选择是远程调用ServerResponse对象上的方法,即通过dnode,但是不是有更好的方法吗?我真的很想能够在远程连接的服务器上使用Express,这就是我想保留http.ServerResponse API的原因。

我很高兴收到任何意见!

谢谢!

0 个答案:

没有答案