如何在客户端请求nodejs中的ws服务器的情况下将数据发送到客户端

时间:2015-11-25 12:10:36

标签: json node.js web-services csv

我需要将csv文件转换为json格式并将其发送到请求在nodejs中使用ws服务器的客户端,

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

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

我的node.js代码:

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 个答案:

答案 0 :(得分:1)

现在,您正在创建一个新的读取流并在每个新连接上向转换器添加一个侦听器,一旦您有多个客户端(多次发出相同的事件等等),这将导致麻烦。而不是那样,你应该只保留一个读者,并在有新记录时通知所有打开的连接。

另请注意,您使用的库只接受UTF-8字符串或二进制类型消息,以现在发送方式发送的行对象将作为" [对象对象]&#接收34;调用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));
}

注意:这不会在开始时发送文件的全部内容,只会发送更新,但您可以轻松实现存储记录并将其发送到新连接。