Node.js 使用WebSocket(节点,Socket.io)读取CSV文件并以一定间隔发送数据
我对Node和Express.js比较陌生。我正在尝试创建一个websocket服务器,以不规则的间隔逐行推送存储在文件中的CSV数据。 CSV结构如下所示: [超时[ms],数据1,数据2,数据3…] 我已经成功地创建了一个与客户端通信的websocket服务器 我正在寻找一个最好的解决方案来有效地执行以下操作: 1.读取CSV文件的一行 2.用WebSocket发送一行 3.将读取暂停一段存储在行的第一个值中的时间 4.间隔结束后恢复读数,然后返回步骤1 到目前为止,我已经走到了这一步,请随意完全丢弃我的代码,因为它可能是非常错误的-正如我所说,我是新手。似乎暂停没有任何作用Node.js 使用WebSocket(节点,Socket.io)读取CSV文件并以一定间隔发送数据,node.js,csv,express,websocket,Node.js,Csv,Express,Websocket,我对Node和Express.js比较陌生。我正在尝试创建一个websocket服务器,以不规则的间隔逐行推送存储在文件中的CSV数据。 CSV结构如下所示: [超时[ms],数据1,数据2,数据3…] 我已经成功地创建了一个与客户端通信的websocket服务器 我正在寻找一个最好的解决方案来有效地执行以下操作: 1.读取CSV文件的一行 2.用WebSocket发送一行 3.将读取暂停一段存储在行的第一个值中的时间 4.间隔结束后恢复读数,然后返回步骤1 到目前为止,我已经走到了这一步,请随
var $ = require('jquery')
,csv = require('csv');
exports.index = function(server){
var io = require('socket.io').listen(server);
io.sockets.on('connection', function (socket) {
socket.on('startTransmission', function(msg) {
csv()
.from.path('C:/dev/node_express/csv/test.csv', { delimiter: ',', escape: '"' })
.on('record', function(row,index){
var rowArray = $.parseJSON(JSON.stringify(row));
var json = {},
that = this;
$.each(rowArray, function(i,value){
json[keys[i]] = value;
});
socket.emit('transmitDataData', json);
//this.pause(); //I guess around here is where I'd like to pause
// setTimeout(function(){
// that.resume(); //and resume here after the timeout, stored in the first value (rowArray[0])
// }, rowArray[0]);
});
});
});
};
不幸的是,注释掉的代码不起作用-所有数据都会立即发送,一行接一行,函数不会暂停我在另一个用例中遇到了同样的情况。问题在于,在流上调用pause会暂停底层流读取,但不会暂停csv记录解析,因此可以使用构成上次读取流块的其余记录调用record事件。在我的例子中,我同步了它们,如下所示:
var rows=0, actions=0;
stream.on('record', function(row, index){
rows++;
// pause here, but expect more record events until the raw read stream is exhausted
stream.pause();
runner.do(row, function(err, result) {
// when actions have caught up to rows read, read more rows.
if (actions==rows) {
stream.resume();
}
});
});
在您的情况下,我会缓冲行并使用计时器释放它们。这里有一个未经测试的重新分解,只是想让您了解我的意思:
var $ = require('jquery'),
csv = require('csv');
exports.index = function(server){
var io = require('socket.io').listen(server);
io.sockets.on('connection', function (socket) {
socket.on('startTransmission', function(msg) {
var timer=null, buffered=[], stream=csv().from.path('C:/dev/node_express/csv/test.csv', { delimiter: ',', escape: '"' });
function transmit(row) {
socket.emit('transmitDataData', row);
}
function drain(timeout) {
if (!timer) {
timer = setTimeout(function() {
timer = null;
if (buffered.length<=1) { // get more rows ahead of time so we don't run out. otherwise, we could skip a beat.
stream.resume(); // get more rows
} else {
var row = buffered.shift();
transmit(row);
drain(row[0]);
}
}, timeout);
}
}
stream.on('record', function(row,index){
stream.pause();
if (index == 0) {
transmit(row);
} else {
buffered.push(row);
}
drain(row[0]); // assuming row[0] contains a timeout value.
});
stream.on('end', function() {
// no more rows. wait for buffer to empty, then cleanup.
});
stream.on('error', function() {
// handle error.
});
});
};
有什么理由使用jquery吗。您没有在这里操作任何DOM元素。不,没有-我以前做过实验,但忘了删除它。谢谢你指出这一点,但这并不能解决问题。暂停和恢复不起作用吗?到底是什么问题?如果您取消对暂停代码的注释,代码看起来应该可以工作。不幸的是,注释掉的代码不工作。我会更新这个问题。