2014-02-12 64 views
2

我終於意識到我將需要在這一個大型的'StackOverflow'槍。這裏是我的代碼,此修復程序不斷躲避我重新加載NODE.JS中的變量值

var express = require('express'), 
    fs = require('fs'), 
    http = require('http'); 

var ppm = JSON.parse(fs.readFileSync('./data/ppm.json', 'utf8')); 

var timestamp = {"timestamp" : ppm.RTPPMDataMsgV1.timestamp }; 

var app = express() 
    .use(express.bodyParser()) 
    .use(express.static('public')); 

app.all('/', function(req, res, next) { 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header("Access-Control-Allow-Headers", "X-Requested-With"); 
    next(); 
}); 

app.get('/ppm/timestamp', function (req, res) { 
    res.send(timestamp); 
}); 

app.get('/*', function (req, res) { 
    res.json(404, {status: 'not found'}); 
}); 

http.createServer(app).listen(3000, function() { 

    setInterval(function(){ 
     var ppm = JSON.parse(fs.readFileSync('./data/ppm.json', 'utf8')); 
     var timestamp = {"timestamp" : ppm.RTPPMDataMsgV1.timestamp }; 
     console.log("File changed"); 
    }, 30000); 

    console.log("Server ready at http://localhost:3000"); 
}); 

這是最後的代碼更精簡版,但也有很多app.get的不僅僅是時間戳。

ppm.json文件每隔30秒由一個單獨的節點程序更新,但唯一可以讓此節點使用新文件的方式是停止並啓動服務器,這是不可接受的。

我曾經做過ppm = require('./ data/ppm.json),但是由於緩存而刪除了這個,並且移到了這個加載JSON的新方法,但沒有成功。我懷疑應用程序也是緩存,因此..再次..我需要重新啓動服務器以獲取新值

我如何使PPM的值每30秒重新加載一次(或者甚至在更改到文件ppm.json通過使用fs.watchfile)而無需重新加載服務器。

在此先感謝

回答

5

setInterval回調pmm之前刪除單詞var。您已經創建了一個本地pmm變量,而不是在您想要的範圍內修改pmm變量。

您還應該避免fs.readFile的同步版本,以便您的服務器可以在IO發生時響應請求。

+0

我所要做的就是放棄VAR ......當然,我曾嘗試過,但顯然不是。現在工作可愛。非常感謝 – MOLEDesign