2016-07-03 5 views
0

サーバー上のアプリケーションによって30秒ごとに更新されるjsonファイルがあります。私は以下のようにwebsocket(socket.io)上でこのjsonファイルを提供するnodejs用の小さなサーバースクリプトを書いています。nodejs websocketスクリプトのfsモジュールで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をログに記録しています。もしスクリプトが何らかの方法で拡張されていれば(これが私の最初のスクリプトなので)

答えて

0

nodejsスクリプトがファイルをチェックしている間にファイルが他のアプリケーションによって書き込まれているときにエラーが発生するので、完全に書き込まれていない間にJSONを解析しています。

エラーunexpected end of JSON inputは、JSONが不正であることを意味します。

関連する問題