我目前正在尝试使用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的原因。
我很高兴收到任何意见!
谢谢!