Express-问题解析查询参数,请求错误

Express-问题解析查询参数,请求错误,express,httprequest,Express,Httprequest,在测试Express端点时,我们发现一些具有长查询字符串(/?x[0]=0&x[1]=1…&x[100]=100)的特定请求失败。应用程序响应HTTP 400(请求错误)。首先,我们认为查询太长,被防火墙/nginx阻止,或者我们遇到了某种nodejs/express限制。然而,经过一些实验,我们发现/?x[21]=21失败,而/?x[20]=20工作正常。为什么会这样?为什么会失败? 结果表明,使用默认的express设置: 调用/?x[20]=20将导致req.query.x=['20']

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

为什么会失败? 结果表明,使用默认的express设置:

  • 调用
    /?x[20]=20
    将导致
    req.query.x=['20']
    ,而
  • 调用
    /?x[21]=21
    将导致
    req.query.x={'21':'21'}
第二个请求未通过验证,因为我们需要的是数组而不是对象

这种奇怪行为背后的原因在于express用于处理查询的库

qs还将限制在数组中指定索引的最大索引为20。任何索引大于20的数组成员都将转换为索引为键的对象

如何解决这个问题? Qs允许您更改
20
的限制,而express允许您设置自己的查询解析器。因此,最简单的解决方案如下所示:

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