Express body-parser 处理表单上的复选框数组
Express body-parser handling checkbox arrays on forms
我有一个带有复选框数组的 HTML 表单(使用 []
命名)。我需要能够使用 express 处理这个问题。我正在使用 body-parser。
问题是未选中的复选框不提交值,同时,body-parser 似乎通过简单的打包删除数组中的 "holes"按索引顺序将值放入数组中,但忽略索引本身。 (更新:实际上它看起来像 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);
test.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 中的请求来验证索引设置是否正确,正文是:
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"
结婚,我只是需要虚假和真实。
此外,重要的是我不会丢失关于数组中应该有多少个复选框的信息。例如,如果我要给每个复选框一个唯一值,我想我可以将 "option":["0","1"]
转换为一个布尔值数组,除非我不知道该数组的大小为 3(第三个值为 false在那种情况下)——虽然我想我可以添加例如像 numberOfCheckboxes=3
这样的隐藏输入,但是......这种映射很麻烦,我想尽可能避免它。
最简单的解决方案(不是最好的)是您可以添加具有不同 ID 的隐藏输入,然后在页面上的复选框未选中时选中它们。
<input type="checkbox" name="option[0]" value="1">
<input type="checkbox" name="option[1]" value="1">
<input type="checkbox" name="option[2]" value="1">
<input type="checkbox" class="hidden" name="hiddenOption[0]" value="1">
<input type="checkbox" class="hidden" name="hiddenOption[1]" value="1">
<input type="checkbox" class="hidden" name="hiddenOption[2]" value="1">
提交前:
$('input[name^=option]').each(function () {
if(!this.checked) {
var name = "input[name=\'hiddenOption" + this.name.replace('option', '') + "\']";
console.log(name);
$(name).prop('checked', true);
}
});
然后根据这个你可以找出哪些没有被勾选。
我的方法不需要在客户端 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);
所以现在正文将是
{option: [null, '1', null]}
我有一个带有复选框数组的 HTML 表单(使用 []
命名)。我需要能够使用 express 处理这个问题。我正在使用 body-parser。
问题是未选中的复选框不提交值,同时,body-parser 似乎通过简单的打包删除数组中的 "holes"按索引顺序将值放入数组中,但忽略索引本身。 (更新:实际上它看起来像 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);
test.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 中的请求来验证索引设置是否正确,正文是:
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"
结婚,我只是需要虚假和真实。
此外,重要的是我不会丢失关于数组中应该有多少个复选框的信息。例如,如果我要给每个复选框一个唯一值,我想我可以将 "option":["0","1"]
转换为一个布尔值数组,除非我不知道该数组的大小为 3(第三个值为 false在那种情况下)——虽然我想我可以添加例如像 numberOfCheckboxes=3
这样的隐藏输入,但是......这种映射很麻烦,我想尽可能避免它。
最简单的解决方案(不是最好的)是您可以添加具有不同 ID 的隐藏输入,然后在页面上的复选框未选中时选中它们。
<input type="checkbox" name="option[0]" value="1">
<input type="checkbox" name="option[1]" value="1">
<input type="checkbox" name="option[2]" value="1">
<input type="checkbox" class="hidden" name="hiddenOption[0]" value="1">
<input type="checkbox" class="hidden" name="hiddenOption[1]" value="1">
<input type="checkbox" class="hidden" name="hiddenOption[2]" value="1">
提交前:
$('input[name^=option]').each(function () {
if(!this.checked) {
var name = "input[name=\'hiddenOption" + this.name.replace('option', '') + "\']";
console.log(name);
$(name).prop('checked', true);
}
});
然后根据这个你可以找出哪些没有被勾选。
我的方法不需要在客户端 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);
所以现在正文将是
{option: [null, '1', null]}