nodejs websocket脚本的fs模块上的JSON文件输入错误

时间:2016-07-03 02:02:34

标签: json node.js socket.io fs pm2

我有一个json文件,它由服务器上的应用程序每30秒更新一次。我已经为nodejs写了一个小服务器脚本,通过websocket(socket.io)提供这个json文件,如下所示。

var app = require('http').createServer();
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(8081, '127.0.0.1');

io.on('connection', function(socket) { 
  fs.readFile('/tmp/live-info', 'utf8', function (err, data) {
    if (err) throw err;
    firstDataObj = JSON.parse(data);
    socket.emit('alert', firstDataObj );
  });
});

var prObj;

setInterval(function(){    
  fs.readFile('/tmp/live-info', 'utf8', function (err, data) {
    if (err) throw err;
    data = JSON.parse(data);
    scTime = data.schedulerTime;
    delete data.schedulerTime;
    if (JSON.stringify(prObj) !== JSON.stringify(data)) {
      prObj = data;
      console.log(prObj.current.name, io.engine.clientsCount);
      prObj.schedulerTime = scTime;
      io.emit('alert', prObj );
      delete prObj.schedulerTime;
    } else {
    console.log("No change", prObj.current.name, "Total connections: ", io.engine.clientsCount);
    }
  });
}, 21100);

如您所见,脚本会定期检查json文件的更改,并在检测到内容(时间戳除外)更改时发出已解析的对象。

我正在使用pm2管理服务器上的nodejs进程。一切正常但我在日志上反复得到跟随错误

SyntaxError: Unexpected end of JSON input
   at Object.parse (native)
   at /var/www/scheduleio/server.js:15:25
   at tryToString (fs.js:449:3)
   at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:436:12)

客户端也没有明显的休息时间。但是,我想了解如何修复此错误,因为我每天在日志中获取大约200个错误,并且如果脚本可以以任何方式增强(因为这是我的第一个这样的脚本)。

1 个答案:

答案 0 :(得分:0)

我的猜测是,当你的nodejs脚本正在检查文件时,由另一个应用程序写入文件时会出现错误,因此解析JSON时它没有完全写入。

错误unexpected end of JSON input表示JSON格式不正确。