我有一个生产服务器(ubuntu),用户填写并发送表单(多部分),以创建或更新记录。
现在,有时当我尝试使用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
}
不时显示部分信息。我没有在我的本地计算机上看到过这种行为,但正如我所说的那样,这种行为很少见,例如每30次一次,但对于客户端丢失发送的数据仍然是非常灾难性的。
这似乎是帆,快递或船长的问题。
我一直在努力调试这几天,这是我得到的最接近的,因为一开始我不知道为什么或什么时候发生,现在我知道表格是正确发送的但帆还是接收不完整或不正确解析。
有没有人遇到过类似的问题?任何导致解决这个问题的想法都是受欢迎的。
版本:
注意:无论是否上传文件都会发生这种情况
编辑:通过使用网络管理器(NetBalancer),我尝试尽可能地降低上传速度1字节/秒,但我没有得到奇怪的行为,所以它没有'似乎慢速网络上传是相关的,至少从手动测试来看,我不确定NetBalancer是多么可靠。
更新 更新的风帆为0.12.1,节点更新为5.8.0,但问题仍然存在。
由于
答案 0 :(得分: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);
})
})();
它从表单中分离文件输入并在末尾附加它们,因此它们总是最后发送。
我相信帆有一个关于输入排序重要性的说明,但很容易错过,他们应该在他们的主页上发出一个巨大的警告......