gpt4 book ai didi

javascript - Express body-parser 处理表单上的复选框数组

转载 作者:搜寻专家 更新时间:2023-10-31 22:53:45 24 4
gpt4 key购买 nike

我有一个带有复选框数组的 HTML 表单(使用 [] 命名)。我需要能够使用 express 处理它。我正在使用 body-parser

问题是未选中的复选框不会提交值,同时,body-parser 似乎通过简单地将值按顺序打包到数组中来删除数组中的“空洞”指数,但忽略指数本身。 (更新:实际上它看起来像 qs is the culprit )。

考虑这个完整的示例,它显示一个表单并使用提交数据的 JSON 转储进行响应:

安装:

npm install express body-parser

index.js:

var express = require("express");
var site = express();

site.use(require("body-parser").urlencoded({extended:true}));

site.get("/", function (req, res) {
res.sendFile(__dirname + "/test.html");
});

site.post("/form", function (req, res) {
res.json(req.body);
});

site.listen(8081);

测试.html:

<html>
<body>
<form method="post" action="/form">
<input type="checkbox" name="option[0]" value="1">
<input type="checkbox" name="option[1]" value="1">
<input type="checkbox" name="option[2]" value="1"><br>
<input type="text" name="text[0]"><br>
<input type="text" name="text[1]"><br>
<input type="text" name="text[2]"><br>
<button type="submit">Submit</button>
</form>
</body>
</html>

在那个例子中,如果我只检查 option[1],我会通过检查 Chrome 中的请求来验证索引设置是否正确,body 是:

option[1]:1
text[0]:
text[1]:
text[2]:

然而,body-parser 折叠了 option 数组并在 req.body 中生成以下内容:

{"option":["1"],"text":["","",""]}

如您所见,text 包含所有三项,但 option 只有一项。同样,如果我要检查 option[0]option[2],请求正文将如下所示:

option[0]:1
option[2]:1
text[0]:
text[1]:
text[2]:

但它会被解析为:

{"option":["1","1"],"text":["","",""]}

我丢失了关于哪个复选框被选中的所有信息。

我的问题是,我该怎么做?希望发生的是,例如:

  • 选中 checkbox[1]:

    {"option":[null,"1",null],"text":["","",""]}
  • 选中 checkbox[0]checkbox[2]:

    {"option":["1",null,"1"],"text":["","",""]}

我实际上并没有与 null"1" 结婚,我只需要 falsey 和 truthy。

此外,重要的是我不会丢失有关应该在数组中有多少个复选框的信息。例如,如果我要给每个复选框一个唯一值,我想我可以将 "option":["0","1"] 转换为 bool 值数组,除非我会丢失知道数组的大小为 3(在这种情况下第三个值为 false)——尽管我想我可以添加例如像 numberOfCheckboxes=3 这样的隐藏输入,但是......这种映射很麻烦,我想尽可能避免它。

最佳答案

我的方法不需要在客户端使用 javascript。添加与同名复选框一样多的隐藏字段

正文解析器将检查的项目解析为数组和字符串其他

我是说

<input type="hidden" name="option[0]" value="0">
<input type="hidden" name="option[1]" value="0">
<input type="hidden" name="option[2]" value="0">
<input type="checkbox" name="option[0]" value="1">
<input type="checkbox" name="option[1]" value="1">
<input type="checkbox" name="option[2]" value="1">

如果您的选项[1]被选中,那么正文解析器将像这样解析它

{option:['0', ['0', '1'], '0']}

这里是修饰符

req.body.option = req.body.option.map(item => (Array.isArray(item) && item[1]) || null);

所以现在 body 会是

{option: [null, '1', null]}

关于javascript - Express body-parser 处理表单上的复选框数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47784098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com