2016-03-13 2 views
4

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

Позволяет сказать, это то, что я обычно получаю:

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
  • Sails 0.11.3

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

EDIT: По с помощью сетевого менеджера (NetBalancer) Я попытался уменьшить скорость загрузки как можно больше 1 байт/с, но я не получаю странное поведение, поэтому не кажется, что медленная загрузка сети связана, по крайней мере, из ручного тестирования, я не уверен, насколько надежным является NetBalancer.

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

Thanks

+0

Может быть, пустые поля не являются отправлено с данными? – Bwaxxlo

+0

Обычно они отправляются, всего несколько раз они измельчаются пустым или нет. И происходит только в обратном порядке, поэтому последние 2 или 3 поля не получают отправки или анализа – Zagen

ответ

4

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

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

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

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

Смежные вопросы