开发者社区> 问答> 正文

nodejs:使用Transform的疑问!? 报错

nodejs:使用Transform的疑问!? 400 报错

使用Transform时,第一次可以从socket接收到客户端数据(HTTP请求),等处理并写入socket一些响应数据后,想再次处理客户端数据时,但获取不到任何数据,使用模式:

var Transform = require("stream").Transform;
var inherits = require("util").inherits;
var Request = function() {
    Transform.call(this);
    this._transform = function(data) {
        console.log("recv data length " + data.length); // 这一句只处理了一次
    };
};
inherits(Request, Transform);

net.createServer(function(socket) {
    var req = new Request();
    socket.pipe(req).pipe(socket);
});



 在浏览器中检查socket使用状态,在发送HTTP请求后,后续数据是发送出去的(数据发送在onopen中),客户端已经发送成功,连接也还在,说明服务器socket已经收到数据了,从Readable的角度看,是监听src的’data’事件,如果Request没有收到数据,是不是可以说src没有触发’data’事件?或者说监听src失效?


展开
收起
优选2 2020-06-04 21:19:36 955 0
1 条回答
写回答
取消 提交回答
  • pipe完会关闭可写流,可能是最后那个pipe(socket)写完后关闭了连接

    试试pipe(socket, {end: false})

    ######

    'end'事件是在客户端发送FIN后触发的,在服务端处理完后达到socket全关闭的状态。

    在pipe中,如果src触发了一个'end'事件,后面的stream才会触发end操作。

    在实验中,读流和写流用的是同一个socket,实验的目的是,如果客户端有数据要处理,经过一系列流管道后返回客户端,客户端如果写关闭(如GET,POST等),服务器处理完后关闭连接,当然,服务器也可以根据业务逻辑判断是否关闭连接,如果客户端没有end,pipe stream怎么会发生end操作呢?

    ######如果我不用这种方式,换一种思路,将:
    var req = new Request();
    socket.pipe(req).pipe(socket);



    换成是:
    Request.prototype.on("request", function(data) { … });
    var req = new Request();
    req.pipe(socket);
    socket.on("readable", function(data) {
        var data = socket.read();
        data && req.emit("request", data);
    });



    之后测试代码,运行正常!
    'readable’事件以被动方式取数据,就更加证实了上面的推测!
    ######
    socket.pipe(base, {"end":false}).pipe(socket);

    socket.pipe(base, {"end":false}).pipe(socket, {"end":})



    经测试,这种方式结果也是一样的!



    ###### 同问楼主解决了吗? 
    2020-06-05 11:51:56
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
探究 Node.js 的服务端之路 立即下载
个推微服务实践 基于OpenResty 和Node.js 立即下载
沪江基于Node.js大规模应用实践 立即下载