2014-02-05 119 views
2

我有一個NODE.JS快遞服務器,它將JSON塊分解成更小的部分,並通過移動設備和我創建的各種其他應用程序的URL路由請求。NODE.JS緩存JSON

我剛剛從測試數據移動到實時數據,但我發現NODE.JS沒有使用最新版本的JSON,而是緩存並重用了服務器運行時就地存在的JSON。

這裏(的一部分)的代碼

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

var ppm = require('./data/ppm.json'); 
var stations= require('./data/stations.json'); 
var fgwstations= require('./data/fgwstations.json'); 

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/all', function (req, res) { 
    res.json(ppm); 
}); 
app.get('/*', function (req, res) { 
    res.json(404, {status: 'datafeed not found please refer to documentation'}); 
}); 

http.createServer(app).listen(3000, function() { 
    console.log("Data Server ready at http://localhost:3000"); 
}); 

有可能的輸入錯誤代碼正如我剛纔撕塊出來的正確artile很長作爲其做了很多。我把這個服務器permenantly使用FOREVER功能,因此它沒有外殼命令是在運行了開放

現在我懷疑我可以做某種類型fs.filewatch功能,將每一個JSON文件被更新時重新啓動服務器,但是如果重新啓動服務器,這似乎有點特別,當這些數據每2-3分鐘更新一次,未來更快。在此重啓過程中,只需要一個人做請求或應用程序請求數據就會導致問題。

是否有一種'重新讀取'分配給var ppm的JSON文件(其他人是Fairlry靜態的)或重新啓動服務器的唯一方法?

關於如何閱讀該文件並做到這一點的任何好主意,將不勝感激,因爲我相信有人會有一個更有效的方式來做到這一點。

目前開發服務器是開源(和非常WIP),並隨時看看它做什麼它加載

http://54.194.148.89:3000 
+0

當您需要JSON文件時,當您更改該文件時它不會自動更新,您必須重新獲取該文件。 – adeneo

回答

4

require()緩存的一切,因爲它是專爲裝載代碼模塊,它不應該正在改變。如果你想重新加載一些東西,你需要delete the cache entry

更好的方法是改爲使用fs.watch,fs.readFileJSON.parse的組合來重新加載更改的數據。無需擺弄緩存或重新啓動服務器。

更好的方法可能是使用某種數據庫而不是文件系統。

+0

數據庫即將到來,現在我只想要實時數據,所以我可以在一些應用程序上工作。這是使用Angular快速檢索數據路由的概念驗證..我將讀一讀你建議的fs和JSON.parse,看看它在這種情況下可以做什麼 感謝您的建議 – MOLEDesign

+0

我用這個模式作爲緩存。我有一個計時器應用程序,它在晚上運行所有數據庫查詢並生成json數據的靜態文件夾。 Angular應用程序通過節點請求靜態數據。它比訪問數據庫要快得多。在我的情況下,數據只需要每天更新一次,因此它適用於這種情況。 – mbokil