Частично размещены данные в sails.js (время от времени)
У меня есть рабочий сервер (Ubuntu), где пользователь заполняет и отправляет форму (multipart), чтобы создать или обновить запись. Теперь иногда, когда я пытаюсь использовать req.allParams()
Я получаю объект с неполными данными.
Допустим, это то, что я обычно получаю:
data: {
id: '58155',
name: 'The Gallery Name',
email: 'gallery@gmail.com',
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: 'gallery@gmail.com',
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, но проблема остается.
Спасибо
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);
})
})();
Он отсоединяет входные данные файла от формы и добавляет их в конце, чтобы они всегда отправлялись последними.
Я считаю, что у парусов есть примечание о важности упорядочения ввода, но его довольно легко пропустить, они должны разместить огромное предупреждение на своей домашней странице об этом...