我一直无法找到这个问题的答案。当使用NodeJS,Express和Express Bodyparser - 以及我的MEAN堆栈的其余部分 - 我遇到了隐藏和禁用字段的问题:提交表单时它们不会出现在req.body对象中。
如果我理解正确,快递的bodyparser方面实际上来自另一个项目。无论如何,我还没有真正弄清楚为什么要删除这些字段或如何阻止这种情况发生。我怀疑它可能与methodoverride有关,但是启用/禁用它对相关字段没有影响。
所以..对于我自己和未来的googler's:这里发生了什么?
根据要求,这是一些代码: JADE:
form(action="/admin/users/edit", method="post", ng-submit='registerUser($event)', name='form', novalidate)
.row(ng-show="ifweareupdating")
label(for="_id") _id:
input(type="hidden", id="_id", name="_id", ng-model="newUser._id")
input(type="text", id="_notHiddenId', name="_notHiddenId", ng-model="newUser._id")
快递:
app.post("/admin/users/edit", pass.ensureAdmin, userRoutes.editUserPost);
userRoutes:
exports.userRoutes.editUserPost = function(req,res,next) {
console.log(req.body._id) // logs undefined
console.log(req.body._notHiddenId) // logs actual id
}
答案 0 :(得分:4)
这与Express无关。在提交表单时,只有成功控件被序列化并由浏览器发送。
The HTML spec defines what makes a control successful.
成功的控制对于提交是“有效的”。每一次成功 control的控制名称与其当前值配对 提交的表单数据集。必须定义成功的控制 在FORM元素中,必须具有控件名称。
然而:
- 禁用的控件无法成功。
- 如果表单包含多个提交按钮,则只有激活的提交按钮成功。
- 所有“打开”复选框都可能成功。
- 对于共享name属性相同值的单选按钮,只有“on”单选按钮可能会成功。
- 对于菜单,控件名称由SELECT元素提供,值由OPTION元素提供。只有选定的选项可能 成功的。如果未选择任何选项,则控件不会 成功,名称和任何值都没有提交给 表单提交时的服务器。
- 文件选择的当前值是一个或多个文件名的列表。提交表格后,每个文件的内容都是 与其余表格数据一起提交。文件内容是 根据表单的内容类型打包。
- 对象控件的当前值由对象的实现决定。
如果控件在提交表单时没有当前值, 用户代理不需要将其视为成功控制。
此外,用户代理不应考虑以下控件 成功的:
- 重置按钮。
- 已设置declare属性的OBJECT元素。
由于样式而未呈现的隐藏控件和控件 表格设置可能仍然成功。
你的问题实际上是Angular。 Apparently,它没有设置隐藏输入的value
。