Javascript 节点:建立socket.io连接时备份自定义发射器

Javascript 节点:建立socket.io连接时备份自定义发射器,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我有一个不断输出新信息的spawn函数。我通过'data'事件监视该繁殖的输出,并发出一个自定义发射器,我称之为'updated',该发射器在从繁殖接收到新数据时发出。在每个“数据”事件发生后,partialData中存储的数据将与“更新”发射器一起发射,然后清除 这似乎工作正常,但在实现socket.io时,似乎会运行“data”事件,但partialData中的结果不会得到处理,彼此堆积,然后会同时发出多次“data”事件。为什么会发生这种情况?我如何解决这个问题?在我使用的实际应用程序中,

我有一个不断输出新信息的spawn函数。我通过'data'事件监视该繁殖的输出,并发出一个自定义发射器,我称之为'updated',该发射器在从繁殖接收到新数据时发出。在每个“数据”事件发生后,partialData中存储的数据将与“更新”发射器一起发射,然后清除

这似乎工作正常,但在实现socket.io时,似乎会运行“data”事件,但partialData中的结果不会得到处理,彼此堆积,然后会同时发出多次“data”事件。为什么会发生这种情况?我如何解决这个问题?在我使用的实际应用程序中,JSON字符串正在被处理,而堆叠导致节点崩溃

本例是大型应用程序的简化版本,但症状相同。下面的示例由一个bash脚本组成,该脚本每1/5秒发出一个时间戳,该时间戳应该从与节点代码相同的目录中运行。启动node命令后,终端将输出partialData的时间戳和长度。每当浏览到127.0.0.1:3000时,您会注意到partialData的长度发生了变化。这就是问题所在

emitter.sh:

#!/bin/bash
while [[ 1 ]]; do
    echo `date +%s`
    usleep 20000
done
emitter.js:

var express = require('/usr/local/lib/node_modules/express');
var http = require('http');
var spawn = require('child_process').spawn;
var events = require('events');
var util = require('util');

var app = express();
var server = http.createServer(app);
var io  = require('/usr/local/lib/node_modules/socket.io').listen(server);

runCommand = function (arg1) {
    var self = this;
    var partialData = '';
    var cmd = spawn(arg1);
    cmd.stdout.setEncoding('utf8');
    cmd.stdout.on('data', function(data) {
        partialData += data.substr(0,data.length-1);
        console.log('data: '+partialData.trim());
        console.log('length: '+partialData.length);
        partialData = '';       
        self.emit('updated', data);
    });
}
util.inherits(runCommand, events.EventEmitter);

var result = new runCommand('./emitter.sh');

app.get('/', function(req, res){
    res.send(
    "<script src='/socket.io/socket.io.js'></script>\n"+
    "<script>\n"+
    "var socket=io.connect('http://127.0.0.1:3000');\n"+
    "</script>\n"
    );
});

server.listen(3000);

io.sockets.on('connection', function(webSocket) {
    console.log('socket established');
});
var express=require('/usr/local/lib/node_modules/express');
var http=require('http');
var spawn=require('child_process')。spawn;
var事件=要求(“事件”);
var util=require('util');
var-app=express();
var server=http.createServer(app);
var io=require('/usr/local/lib/node_modules/socket.io')。侦听(服务器);
runCommand=函数(arg1){
var self=这个;
var partialData='';
var cmd=spawn(arg1);
cmd.stdout.setEncoding('utf8');
cmd.stdout.on('data',函数(data){
partialData+=data.substr(0,data.length-1);
log('data:'+partialData.trim());
log('length:'+partialData.length);
部分数据='';
self.emit('updated',data);
});
}
继承(runCommand,events.EventEmitter);
var result=newruncommand('./emitter.sh');
app.get('/',函数(req,res){
res.send(
“\n”+
“\n”+
“var socket=io.connect('http://127.0.0.1:3000“);\n”+
“\n”
);
});
听(3000);
io.sockets.on('connection',函数(webSocket){
log(“已建立套接字”);
});

不能保证每次shell脚本输出一行时都会触发
数据事件;当发生其他I/O时(如
socket.io
示例),允许缓冲输出

如果需要线路支持,可以使用以下模块:

var cmd = spawn(arg1);
cmd.stdout.setEncoding('utf8');
var linereader = require('readline').createInterface(cmd.stdout, cmd.stdin);
linereader.on('line', function(line) {
  ...
});