【发布时间】:2017-04-26 20:19:49
【问题描述】:
我有一个带有一组复选框的 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);
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 这样的隐藏输入,但是......这种映射很麻烦,如果可能的话我想避免它。
【问题讨论】:
标签: javascript html node.js express body-parser