我有一个带有复选框数组的 HTML 表单(使用[]
命名)。我需要能够处理这个express。我在用着正文解析器.
问题是未选中的复选框不会提交值,同时,正文解析器似乎通过简单地将值按索引顺序打包到数组中来消除数组中的“漏洞”,但忽略索引本身。 (更新:实际上看起来像qs是罪魁祸首).
考虑这个完整的示例,它显示一个表单并以所提交数据的 JSON 转储进行响应:
Install:
npm install express body-parser
索引.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 中的请求来验证索引设置是否正确,正文为:
option[1]:1
text[0]:
text[1]:
text[2]:
然而 body-parser 崩溃了option
数组并产生以下内容req.body
:
{"option":["1"],"text":["","",""]}
如你看到的,text
三者都有,但是option
只有一项。同样,如果我要检查option[0]
and option[2]
,请求正文将如下所示:
option[0]:1
option[2]:1
text[0]:
text[1]:
text[2]:
但它会被解析为:
{"option":["1","1"],"text":["","",""]}
我丢失了有关选中哪个复选框的所有信息。
我的问题是,我该怎么做呢? What I want发生的是,例如:
-
With checkbox[1]
检查:
{"option":[null,"1",null],"text":["","",""]}
-
With checkbox[0]
and checkbox[2]
检查:
{"option":["1",null,"1"],"text":["","",""]}
我实际上并没有结婚null
and "1"
,我只需要 false 和 true 。
Also, 重要的是我不要丢失有关有多少个复选框的信息should位于数组中。例如,如果我要给每个复选框一个唯一的值,我想我可以翻译"option":["0","1"]
到一个布尔值数组中,除非我会失去该数组大小为 3 的知识(在这种情况下第三个值为 false)——尽管我想我可以添加例如隐藏输入,例如numberOfCheckboxes=3
,但是...这种映射很麻烦,如果可能的话我想避免它。