【问题标题】:Node error TypeError: req.query.acct_stmt_id.map is not a function depending on array size节点错误 TypeError: req.query.acct_stmt_id.map 不是取决于数组大小的函数
【发布时间】:2023-03-28 16:45:01
【问题描述】:

我有一个奇怪的错误,以下路由对于大小为 10 的输入数组正常工作,但对于大小为 100 的输入数组抛出错误 TypeError: req.query.acct_stmt_id.map is not a function

我在运行节点时使用--max-http-header-size=65536

// Edit: I am running node/express with these configs:
app.use(express.urlencoded({ extended: true, limit: '100mb', parameterLimit: 1000000 }));

app.get("/api/v1/config", async function(req, res) {
  
  if (!validateAPIKey(req.query.api_key)){
    res.sendStatus(403);
  } else {

    if (req.query.arr_data) {

      try {
        // turn strings into numbers
        var input_arr_numbers= req.query.arr_data.map(Number);

        const [data, fields] = await promisePool.query("SELECT field FROM table WHERE status_id=100 AND id IN (?);", [input_arr_numbers]);

        if (data.length > 0)
        {
          console.log("data: " + JSON.stringify(data));
          res.writeHead(200, {"Content-Type": "application/json"});
          res.end(JSON.stringify(data));
        } else {
          res.sendStatus(404);
        }

      } catch (err) {
        console.error(err);
        res.sendStatus(500);

      } 

    } else {
      res.sendStatus(404);
    }

  }

});

更新:我玩弄了数组中的元素数量,并在节点路由中打印了数组。我注意到最多 20 个元素 (content-length: 475) 该数组实际上是一个常规数组,可以在其上应用 array.map() 函数。有 21 个元素 (content-legnth: 504),它变成了一个关联数组。我在发送方没有任何更改,并且在打印请求时,实际进入节点的内容没有任何更改:

// I changed the array name (arr_data) vis-a-vis what I am really using in my code
/api/v1/config?api_key=ABCDEFG&arr_data[0]=657&arr_data[1]=637&arr_data[2]=567&arr_data[3]=517&arr_data[4]=587&arr_data[5]=627&arr_data[6]=607&arr_data[7]=557&arr_data[8]=677&arr_data[9]=507&arr_data[10]=687&arr_data[11]=547&arr_data[12]=647&arr_data[13]=537&arr_data[14]=527&arr_data[15]=707&arr_data[16]=577&arr_data[17]=597&arr_data[18]=617&arr_data[19]=667&arr_data[20]=697

// console.log(arr_data)
[
  '657', '637', '567', '517',
  '587', '627', '607', '557',
  '677', '507', '687', '547',
  '647', '537', '527', '707',
  '577', '597', '617', '667',
  '697'
]

// when I sent > 20 records in arr_data
/api/v1/config?api_key=ABCDEFG&arr_data[0]=1027&arr_data[1]=1047&arr_data[2]=1017&arr_data[3]=747&arr_data[4]=807&arr_data[5]=797&arr_data[6]=997&arr_data[7]=907&arr_data[8]=767&arr_data[9]=1067&arr_data[10]=717&arr_data[11]=1057&arr_data[12]=727&arr_data[13]=1007&arr_data[14]=777&arr_data[15]=737&arr_data[16]=1077&arr_data[17]=787&arr_data[18]=827&arr_data[19]=857&arr_data[20]=1037&arr_data[21]=757

// array.map(Number) fails on this (obviously)
{
  '0': '1027',
  '1': '1047',
  '2': '1017',
   ...
}

有谁知道 Node/Express 为什么要更改数组以及如何防止它?

【问题讨论】:

  • 你能把arr_data的值加起来吗?另外,当它的长度超过10时,你确定它是一个数组吗?另外,请检查此链接,可能是由于 URL 中的字符长度,只是推测。
  • 我正在使用--max-http-header-size=65536 选项运行节点,因为我经常需要在GET 请求中处理大型数组
  • 查看this链接
  • 感谢您的评论,我通过使用 CURL 的后端应用程序使用 API,因此浏览器限制在这里无关紧要。此外,我已将服务器配置为接受大型标头/请求。请看我上面的更新,节点正在将get请求中的数组更改为一定大小后的关联数组,这似乎是问题所在。

标签: javascript node.js arrays async-await


【解决方案1】:

可以通过像这样更改 GET 请求来解决此问题:

/api/v1/config?api_key=ABCDEFG&arr_data[]=1027&arr_data[]=1047&arr_data[]=1017&arr_data[]=747&arr_data[]=807&arr_data[]=797&arr_data[]=997&arr_data[]=907&arr_data[]=767&arr_data[]=1067&arr_data[]=717&arr_data[]=1057&arr_data[]=727&arr_data[]=1007&arr_data[]=777&arr_data[]=737&arr_data[]=1077&arr_data[]=787&arr_data[]=827&arr_data[]=857&arr_data[]=1037&arr_data[]=757

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 2010-09-23
    • 2019-11-02
    • 2020-11-24
    • 2023-01-24
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多