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

时间:2015-05-27 17:28:48

标签: express httprequest

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

1 个答案:

答案 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});
});