У меня есть 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, тело:
option[1]:1
text[0]:
text[1]:
text[2]:
Но тело-анализатор сворачивает 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 (при этом в этом случае 3-е значение false) - хотя, я думаю, я мог бы добавить, например скрытый ввод, такой как numberOfCheckboxes=3
, но ... этот вид сопоставления громоздкий, и я хотел бы избежать его, если это возможно.
Связанные вопросы отвечал: https://github.com/expressjs/body-parser/issues/211, https://github.com/ljharb/qs/ issues/181 –