Express - 发布解析查询参数,错误请求

Kon*_*nel 2 httprequest express

在测试我们的Express端点时,我们发现一些具有长查询字符串(/?x[0]=0&x[1]=1 ... &x[100]=100)的特定请求失败.应用程序正在响应HTTP 400(错误的请求).首先,我们认为查询太长,并且它被firewall/nginx阻止,或者我们正在遇到某种nodejs/express限制.然而,经过一些实验,我们发现/?x[21]=21/?x[20]=20工作正常时失败了.这是为什么?

Kon*_*nel 10

为什么失败?

事实证明,使用默认快速设置:

  • 呼叫/?x[20]=20结果req.query.x = [ '20' ],而
  • 打电话给/?x[21]=21结果req.query.x = { '21': '21' }.

第二个请求没有通过验证,因为我们期待一个数组而不是一个对象.

这种奇怪行为背后的原因在于qs库表示用于处理查询.

qs还会将数组中的索引限制为最大索引20.任何索引大于20的数组成员都将转换为索引为关键字的对象

如何解决这个问题?

Qs允许您更改限制20和表达允许您设置自己的查询解析器.所以最简单的解决方案如下:

app.set('query parser', function (str) {
  return qs.parse(str, {arrayLimit: 1000});
});
Run Code Online (Sandbox Code Playgroud)