套接字是一个流

时间:2017-03-13 02:56:31

标签: node.js

使用rx-node库,我希望此代码能够正常运行。但它不会将socket识别为stream

stream.pause();
          ^

TypeError: Cannot read property 'pause' of undefined

即使显示net文档,也是如此。

如何获取stream

net.createServer()部分
var RxNode = require('rx-node');
var server;
var sSocket;

server =  net.createServer(function (socket) {
  sSocket = socket;
});

var subscription = RxNode.fromStream(sSocket, 'ondata')
    .subscribe(function (x) {process.stdout.write("Got data " + x + "\n"); });

server.listen(xxxxx, 'xxx.xxx.xx.xxx');

1 个答案:

答案 0 :(得分:0)

是的,socket是一个流。你得到的问题不是它不是一个流,而是它未定义。请参阅文档:

  

类:net.Socket#   添加于:v0.3.4   此对象是TCP或本地套接字的抽象。 net.Socket实例实现双工流接口。它们可以由用户创建并用作客户端(使用connect()),也可以由Node.js创建,并通过'连接传递给用户。服务器的事件。 [强调补充]

当这个:

TypeError: Cannot read property 'pause' of undefined

给出了这个错误:

stream

这意味着stream未定义,而不是它不是流。

在您的情况下,sSocket很可能是您传递给RxNode.fromStream()的{​​{1}}变量,只是通过查看代码显然未定义。评估顺序如下:

var sSocket; // (1)

server =  net.createServer(function (socket) { // (2)
  sSocket = socket; // (4)
});

var subscription = RxNode.fromStream(sSocket, 'ondata') // (3)

因为您可以看到您在定义之前尝试使用它。

现在,如何在定义之后使用它?你需要在net.createServer()回调中使用它,或者在回调被触发后启动的某个函数中使用它。

您的代码的另一个问题是,您传递给net.createServer()的功能是connectionListener,它会自动设置为'连接的监听器。事件,你似乎正在使用它,就像它是其他东西。请参阅文档中的示例:

这与你想要做的完全一样。