2016-04-23 65 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实例,一切似乎都解决了。希望这会阻止那些试图做同样事情的人。