javascript - Socket.io-Stream 不发送给客户端

标签 javascript socket.io nodejs-stream

我正在尝试从服务器向客户端发送(中继)连续的 utf-8 数据流。虽然我可以看到到达服务器的数据,但我无法将其通过管道传输到套接字并将其转发给客户端。

节点服务器,

var io = require('socket.io')(server);
app.io = io;
var dsteem = require('dsteem')
var es = require('event-stream') 
var client = new dsteem.Client('https://api.steemit.com')
var ss = require('socket.io-stream'); 
var outBoundStream = ss.createStream();
var stream = client.blockchain.getBlockStream();

io.on('connection', function(socket) {
    /* Eyeball the data in the nodejs console */ 
    stream.pipe(es.map(function(block, callback) {
    callback(null, util.inspect(block, {colors: true, depth: null}) + '\n')
    })).pipe(process.stdout);
    /* Send stream data to client */
    ss(socket).on('ready', function(){
        console.log('Here it comes...');
        ss(socket).emit('sending', function(){
            stream.pipe(es.map(function(block, callback) {
            callback(null, util.inspect(block, {colors: true, depth: null}) + '\n')
            }));
        });
    });

    ss(socket).on('disconnect', function(){
        console.log('Disconnected');
    });
});

我在 nodejs 控制台中看到的来自 .getBlockStream() 的数据看起来像这样的片段,

 {['1b3c0394d1146cecdc0b5d38486f0b99a6d7c750',
 '85e3110930f87510b4782d50de86180ecbacf05d',
 '7cbd01b2a9d515736860014eabbc18893707e0c4',
 '307308574fec6336493d0a9713ee98da21bbc1a7',
 '9cb1636cdb2591361b7d7e4c9d04096c1bc93aff',
 '27d22c51a6f3e0d764039b095046ec563e53ae6b',
 '153451e251816823e3342d2f0b1425570d0f3d36',
 '0a17b03e9fddfde49ad632dfe2437d76321c34eb',
 'fdd23d78865d1855b16d171d24199dd4e2fba83a',
 '306e6f2b11e6bd6e2ef37acbe6e593ef2d1c0e1e' ] }

客户端,

<script src="/socket.io/socket.io.js"></script>
<script src="/javascripts/socket.io-stream.js"></script>
<script> 
$(function () {
    var socket = io();
    ss(socket).emit('ready', 'Client ready, send me a stream...');
    ss(socket).on('sending', function(stream, d){
            console.log(stream);
  });
});
</script>

在浏览器控制台中我只看到这个函数,

ƒ () {
        var args = slice.call(arguments);
        args = self.encoder.encode(args);
        ack.apply(this, args);
      }

谁能帮助我理解我做错了什么?

最佳答案

出现这个问题是因为你有以下代码

ss(socket).emit('sending', function(){
   stream.pipe(es.map(function(block, callback) {
   callback(null, util.inspect(block, {colors: true, depth: null}) + '\n')
}))

emit 方法的第二个参数需要数据,而您正在向它发送一个函数,因此您在客户端收到的是一个空白函数

修复很简单,发送数据即可

io.on('connection', function(socket) {
    /* Eyeball the data in the nodejs console */
    /* Send stream data to client */
    ss(socket).on('ready', function(){
        console.log('Here it comes...');
        stream.pipe(es.map(function(block, callback) {
            ss(socket).emit('sending', block);
            callback(null, util.inspect(block, {colors: true, depth: null}) + '\n')

        })).pipe(process.stdout);

    });

    ss(socket).on('disconnect', function(){
        console.log('Disconnected');
    });
});

完成后,您可以在客户端看到数据

data client

关于javascript - Socket.io-Stream 不发送给客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48646434/

相关文章:

javascript - VueJS : Bind values to Component

javascript - 如何在语音合成中改变声音?

node.js - 使用 Node 连接到 MongoDB 服务器在本地主机上没有响应

javascript - 向特定用户广播事件(socket.io、redis、node)

javascript - 流和事件循环 - 数据处理程序是否总是在下一个时钟周期触发?

node.js - 根据 mongodb 类型不推荐使用 find 方法

javascript - 如何检测表单是如何通过 JavaScript 提交的?

javascript - 有没有一种方法可以在不使用魔数(Magic Number)作为 Amchart v4 半径的情况下将嵌套饼图中的标签居中?

node.js - 在 socket.io 中使用 RedisStore 的示例

node.js - 超出最大堆栈大小 - 事件流