2016-04-23 12 views
0

Ich habe eine Angular/Express/Node-App erstellt, die in Google Cloud ausgeführt wird und derzeit eine JSON-Datei verwendet, die als Datenquelle für meine Anwendung dient. Aus irgendeinem Grund (und das passiert nur in der Cloud), wenn Daten durch einen Ajax-Aufruf gespeichert und in die JSON-Datei geschrieben werden, scheint alles in Ordnung zu sein. Beim Aktualisieren der Seite sendet mir der Server (manchmal!) Jedoch die Version vor der Bearbeitung. Ich kann nicht sagen, ob dies ein Express-bezogenes, Node-bezogenes oder sogar Angular-bezogenes Problem ist, aber was ich sicher weiß, ist, dass ich das JSON überprüfe, das in der Antwort vom Server kommt, und das ist es wirklich manchmal die modifizierte Version, manchmal nicht, also ist es höchstwahrscheinlich nicht eckig cache-bezogen.Seltsames (Caching) Problem mit Express/Node

Die 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); 
}); 

Die 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 + ''); 
}); 

Dies ist wahrscheinlich nicht viel sagen, also wenn jemand helfen interessiert ist, Sie das Problem here leben sehen. Wenn Sie für das erste Konzert auf modify klicken und die programme in etwas wie asd ändern und dann speichern, sieht alles gut aus. Aber wenn Sie versuchen, die Seite ein paar Mal zu aktualisieren (in der Regel werden sogar 6-7 Versuche benötigt), wird das alte, unveränderte programme angezeigt. Jeder Hinweis oder Rat sehr geschätzt, danke.

Antwort

0

Lösung: Verwenden Sie keine lokalen Dateien zum Speichern von Daten in der Cloud! Dafür gibt es Datenbanken!

Was war eigentlich das Problem?

Das Problem wurde durch die Tatsache verursacht, dass auf der App Engine 2 VM-Instanzen für meine Anwendung ausgeführt wurden. Dies führte dazu, dass die POST-Anforderung an eine Instanz gesendet wurde, ihre Aufgabe ausgeführt, die Daten durch Ändern ihrer lokalen JSON-Datei gespeichert und eine 200 zurückgegeben wurde. Nach einigen Aktualisierungen führt der Lastenausgleich jedoch dazu, dass GET bei der anderen ankommt Maschine, die ihren individuellen Quellcode hat, einschließlich des ursprünglichen, nicht modifizierten JSON. Ich verwende jetzt eine MongoDB-Instanz und alles scheint gelöst zu sein. Hoffentlich entmutigt dies Leute, die versuchen, dasselbe zu tun, was ich getan habe.