Частично размещенные данные в sails.js (время от времени)

У меня есть производственный сервер (ubuntu), где пользователь заполняет и отправляет форму (составную) для создания или обновления записи. Теперь иногда, когда я пытаюсь использовать req.allParams(), я получаю объект с неполными данными.

Скажем так, я обычно получаю:

data: {
    id: '58155',
    name: 'The Gallery Name',
    email: '[email protected]',
    phone: '(+54911)68460005',
    url: 'www.theurl.com',
    workingHours: 'Tuesday - Friday 3 - 8 pm',
    artists: ['58350', '15503', '58346', '58347', '58348', '58349'],
    locations: [{ 
      country: 1,
      state: null,
      city: 45,
      zip: '33175',
      address: '' }
    ],
    showOnGuide: true,
    preferredLanguage: 'en',
    events: [1, 4, 5]
  }
};

Но время от времени получаю:

   data: {
        id: '58155',
        name: 'The Gallery Name',
        email: '[email protected]',
        phone: '(+54911)68460005',
        url: 'www.theurl.com',
        workingHours: 'Tuesday - Friday 3 - 8 pm',
        artists: ['58350', '15503', '58346', '58347', '58348', '58349']
      }
    };

Я проверил формы, и они верны, поэтому единственное, что очевидно, это то, что отсутствуют только последние ключи (поля формы), поэтому я предполагаю, что это может быть связано с некоторым тайм-аутом POST?

Для ясности: вот как я получаю данные до любого форматирования, выполненного с моей стороны, и даже размещения журнала в sails/node_modules/skipper/index.js

/// .. some code
MultipartBodyParser(req, res, function(err) {
    if (err) return next(err);
    console.log(req.body);
/// ... some code
}

время от времени показывает частичную информацию. Я не видел такого поведения на своем локальном компьютере, но, как я уже сказал, это редко, примерно 1 раз в 30 раз, но все же довольно катастрофично для клиента, если он потеряет отправленные данные.

Это похоже на проблему с парусами, экспрессом или шкипером.

Я пытался отладить это в течение нескольких дней, и это самое близкое, что я получил, так как вначале я ничего не знал, почему и когда это происходило, теперь я знаю, что форма отправлена ​​правильно, но паруса либо получает его неполным, либо неправильно разбирает.

Кто-нибудь сталкивался с подобной проблемой? Приветствуются любые мысли, которые приводят к решению этой проблемы.

Версии:

  • Узел 0.12
  • Паруса 0.11.3

Примечание. Это происходит как при загрузке файла, так и без него.

РЕДАКТИРОВАТЬ: с помощью сетевого менеджера (NetBalancer) я попытался снизить скорость загрузки до 1 байта / с, но я не получаю странного поведения, поэтому не похоже, что медленная загрузка сети связана, по крайней мере, из ручного тестирования, я не уверен, насколько надежен NetBalancer.

Обновление: Обновлены паруса до 0.12.1 и узел до 5.8.0, но проблема не устранена.

Спасибо


person Lu Roman    schedule 13.03.2016    source источник
comment
Может быть, пустые поля не отправляются вместе с данными?   -  person Bwaxxlo    schedule 14.03.2016
comment
Их обычно присылают, просто пару раз рубят пусто или нет. И происходит только в обратном порядке, поэтому последние 2 или 3 поля не отправляются и не анализируются.   -  person Lu Roman    schedule 14.03.2016


Ответы (1)


Я понял, в чем проблема. Он в значительной степени представлен только на соединениях с низкой скоростью загрузки, и особенно при загрузке изображений, проблема в том, как шкипер обрабатывает данные формы, когда он обнаруживает ввод файла (кажется, что это происходит, даже если входной файл пуст), он закрывает ввод текста потоки, поэтому они никогда не будут захвачены. Теперь решение состоит в том, чтобы отформатировать вашу форму таким образом, чтобы входные данные файла помещались после всех других входных данных (поскольку спецификация html требует, чтобы браузеры отправляли входные данные по порядку), но не всегда возможно сделать это без каких-либо тяжелых стиль меняется, поэтому решение, которое я придумал, заключается в использовании этого небольшого фрагмента:

(function () {
    var $form = $('form[enctype="multipart/form-data"]');
    var $fileInputs = $($form.find('input[type="file"]'));
    $form.submit(function() {
      $fileInputs.detach();
      $form.append($fileInputs);
    })
  })();

Он отделяет входные данные файла от формы и добавляет их в конце, поэтому они всегда отправляются последними.

Я считаю, что в парусах есть примечание о важности порядка ввода, но его довольно легко пропустить, они должны разместить огромное предупреждение на своей домашней странице об этом ...

person Lu Roman    schedule 29.04.2016