2015-11-25 29 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

相關問題