2016-04-23 68 views
0

我已經構建了一個在谷歌雲中運行的角度/快速/節點應用程序,它目前使用JSON文件作爲我的應用程序的數據源。出於某種原因,(這隻發生在雲端)在通過ajax調用保存數據並將其寫入json文件時,一切似乎都正常。但是,刷新頁面時,服務器(有時候!)會在編輯之前向我發送版本。我無法分辨這是否與Express相關,與Node相關,甚至與Angular相關的問題,但是我確切知道的是,我正在檢查來自服務器響應中的JSON,它確實是有時候是修改後的版本,有時候不會,所以它最有可能不是角度緩存相關的。快遞/節點怪異(緩存)問題

GET

router.get('/concerts', function (request, response) { 
    delete require.cache[require.resolve('../database/data.json')]; 
    var db = require('../database/data.json'); 
    response.send(db.concerts); 
}); 

POST

router.post('/concerts/save', function (request, response) { 
    delete require.cache[require.resolve('../database/data.json')]; 
    var db = require('../database/data.json'); 
    var concert = request.body; 
    console.log('Received concert id ' + concert.id + ' for saving.'); 
    if (concert.id != 0) { 
     var indexOfItemToSave = db.concerts.map(function (e) { 
      return e.id; 
     }).indexOf(concert.id); 
     if (indexOfItemToSave == -1) { 
      console.log('Couldn\'t find concert with id ' + concert.id + 'in database!'); 
      response.sendStatus(404); 
      return; 
     } 
     db.concerts[indexOfItemToSave] = concert; 
    } 
    else if (concert.id == 0) { 
     concert.id = db.concerts[db.concerts.length - 1].id + 1; 
     console.log('Concert id was 0, adding it with id ' + concert.id + '.'); 
     db.concerts.push(concert); 
    } 
    console.log("Added stuff to temporary db"); 
    var error = commit(db); 
    if (error) 
     response.send(error); 
    else 
     response.status(200).send(concert.id + ''); 
}); 

這可能沒有說太多,因此,如果有人有興趣幫助,你可以看到這個問題住here。如果您點擊modify進行第一場音樂會,並將programme更改爲像asd之類的內容,然後保存,則一切都很正常。但是,如果嘗試刷新頁面幾次(通常甚至需要高達6-7次嘗試),則會顯示舊的未更改的programme。任何線索或建議非常感謝,謝謝。

回答

0

解決方法:請勿使用本地文件將數據存儲在雲中!這是數據庫的用途!

究竟是什麼問題?

問題是由於App Engine有2個VM實例運行在我的應用程序中。這導致POST請求被髮送到一個實例,它做了它的工作,通過修改它的本地JSON文件保存了數據,並且返回了200.但是,在刷新幾次之後,負載均衡導致GET到達另一個機器,它有其獨立的源代碼,包括初始的,未修改的JSON。我現在正在使用一個MongoDB實例,一切似乎都解決了。希望這會阻止那些試圖做同樣事情的人。