在测试我们的Express端点时,我们发现一些具有长查询字符串(/?x[0]=0&x[1]=1 ... &x[100]=100
)的特定请求失败。应用正在使用 HTTP 400 (错误请求)进行响应。首先,我们认为查询太长并且它被firewall / nginx阻止,或者我们正在遇到某种nodejs / express限制。但是,经过一些实验,我们发现/?x[21]=21
失败而/?x[20]=20
工作正常。那是为什么?
答案 0 :(得分:10)
事实证明,使用默认快速设置:
/?x[20]=20
会产生req.query.x = [ '20' ]
,而/?x[21]=21
会导致req.query.x = { '21': '21' }
。第二个请求没有通过验证,因为我们期待一个数组而不是一个对象。
这种奇怪行为背后的原因在于qs库,它表达了处理查询的用途。
qs还会限制将数组中的索引指定为最大索引20.任何索引大于20的数组成员都将转换为索引为键的对象
Qs允许您更改20
的限制,而express允许您设置自己的查询解析器。所以最简单的解决方案如下:
app.set('query parser', function (str) {
return qs.parse(str, {arrayLimit: 1000});
});