【发布时间】: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