2015-11-25 27 views
0

我需要一个CSV文件转换成JSON格式,并将其发送到客户端请求中的NodeJS WS服务器的WS服务器,如何将数据发送到客户端进行客户端请求中的NodeJS

该文件将更新很多次,所以我需要发送更新的数据到客户端

我能够发送数据,一旦它被完全加载(如当应用程序启动它发送文件中的所有数据到客户端),但当我更新数据文件更新后的数据正在控制台上打印出来,但它没有被发送到客户端是他们在我的代码中的任何错误

my node.js code:

var ts = require('tail-stream'); 
var Converter = require("csvtojson").Converter; 
var converter = new Converter({constructResult:false}); //for big csv data 

var WebSocketServer = require('websocket').server; 
var http = require('http'); 

var server = http.createServer(function(request, response) { 
    // process HTTP request. Since we're writing just WebSockets server 
    // we don't have to implement anything. 
    response.write('hello'); 
    console.log('in http server \n'); 
}); 
server.listen(1337, function() { }); 

// create the server 
wsServer = new WebSocketServer({ 
    httpServer: server 
}); 

// WebSocket server 
wsServer.on('request', function(request) { 
    var connection = request.accept(null, request.origin); 

    console.log('wsserver'); 
    connection.send('ws server'); 

    converter.on("record_parsed", function (jsonObj) { 
    console.log(jsonObj); //here is your result json object 
    connection.send(jsonObj); 

}); 


var tstream = ts.createReadStream('log.csv', { 
    beginAt: 0, 
    onMove: 'follow', 
    detectTruncate: false, 
    onTruncate: 'end', 
    endOnError: false 
}); 


tstream.pipe(converter); 
}); 

回答

1

现在你正在创建一个新的读数据流,并添加监听到转换器每一个新的连接上,这会造成麻烦,一旦你有一个以上的客户端(同一事件发出多次,等..) 。而不是你应该只保留一个阅读器,并在有新记录时通知所有打开的连接。

还要注意,您所使用的库只接受UTF-8字符串或二进制类型的消息,行对象送你送他们现在将被接收为“的翻译:” toString()后弦的调用方式在他们。您应该发送刚发送的行字符串或使用JSON.stringify/JSON.parse

试试这个:

var http   = require("http"); 
var tailStream  = require("tail-stream"); 
var Converter  = require("csvtojson").Converter; 
var WebSocketServer = require("websocket").server; 

var server = http.createServer(); 
var wsServer = new WebSocketServer({ httpServer: server }); 
var converter = new Converter({constructResult:false}); 
var logStream = tailStream.createReadStream("log.csv", { detectTruncate : false }); 

var connections = []; 


server.listen(1337); 
logStream.pipe(converter); 


//---------------------------------------------------- 
converter.on("record_parsed", function (jsonObj) { 

    connections.forEach(function(connection){ 
     connection.send(JSON.stringify(jsonObj)); 
    }); 
}); 


//---------------------------------------------------- 
wsServer.on("request", function(request) { 

    var connection = request.accept(null, request.origin); 

    connection.on("close", function() { 
     connections.splice(connections.indexOf(connection), 1); 
    }); 

    connections.push(connection); 
}); 

上述工程的代码,这样的测试在客户端:

var socket = new WebSocket('ws://localhost:1337/'); 

socket.onmessage = function (event) { 
    console.log(JSON.parse(event.data)); 
} 

注:这不会在一开始发送文件的全部内容,只是更新,但是您可以轻松实现这种存储记录并在新连接上发送它们。

+0

我们可以将已更新的记录发送给客户端吗?已经连接新的连接 – Labeo

+0

是吗?不知道我明白你的问题 – cviejo

+0

我的主要问题是,只有天气,我们可以发送更新的数据给客户与新的连接或请求到服务器 – Labeo

相关问题