Странная (кеширующая) проблема с Express / Node

0

Я создал приложение углового/экспресс-узла, которое работает в облаке Google, которое в настоящее время использует файл JSON, который служит в качестве источника данных для моего приложения. По какой-то причине (и это происходит только в облаке) при сохранении данных через вызов ajax и записи его в json файл, все работает нормально. Однако при обновлении страницы сервер (иногда!) Отправляет мне версию перед редактированием. Я не могу сказать, относится ли это связанная с Express, связанная с узлом или даже проблема с угловым выражением, но я точно знаю, что я проверяю 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 + '');
});

Это, вероятно, мало говорит, поэтому, если кто-то заинтересован в помощи, вы можете увидеть проблему здесь. Если вы нажмете на modify для первого концерта и измените programme на что-то вроде asd а затем сохраните, все будет выглядеть нормально. Но если вы попытаетесь обновить страницу несколько раз (обычно требуется даже до 6-7 попыток), отображается старая неизменная programme. Любые подсказки или советы очень ценятся, спасибо.

Теги:
express

1 ответ

0

Чтобы решить: не используйте локальные файлы для хранения данных в облаке! Для этого нужны базы данных!

В чем проблема?

Проблема была вызвана тем, что в App Engine было задействовано 2 экземпляра VM для моего приложения. Это вызвало отправку запроса POST в один экземпляр, выполнение его работы, сохранение данных путем изменения его локального файла JSON и возврат 200. Однако после нескольких обновлений балансировка нагрузки заставляет GET прибыть на другую машина, которая имеет свой собственный исходный код, включая исходный, немодифицированный JSON. Теперь я использую экземпляр MongoDB, и все, кажется, решено. Надеюсь, это препятствует людям, которые пытаются сделать то же самое, что и я.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню