隐藏/禁用字段从 req.body 中消失(Express JS bodyParser)

Jon*_*on 2 javascript node.js express angularjs

我一直无法找到这个问题的答案。在使用 NodeJS、Express 和 Express Bodyparser 以及我的 MEAN 堆栈的其余部分时,我遇到了隐藏字段和禁用字段的问题:提交表单时,它们没有显示在 req.body 对象中。

如果我理解正确的话,express 的 bodyparser 方面实际上是从另一个项目中获取的。无论如何,我一直无法弄清楚为什么要删除这些字段或如何阻止这种情况发生。我怀疑它可能与methodoverride有关,但启用/禁用它对相关字段没有影响。

所以..对于我自己和未来的谷歌人来说:这里发生了什么?

这是一些代码,根据要求: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")
Run Code Online (Sandbox Code Playgroud)

表达:

app.post("/admin/users/edit", pass.ensureAdmin, userRoutes.editUserPost);
Run Code Online (Sandbox Code Playgroud)

用户路由:

exports.userRoutes.editUserPost = function(req,res,next) { 
    console.log(req.body._id) // logs undefined
    console.log(req.body._notHiddenId) // logs actual id
}
Run Code Online (Sandbox Code Playgroud)

jos*_*736 5

这与 Express 无关。只有成功的控件才会在提交表单时序列化并由浏览器发送。

HTML 规范定义了使控件成功的原因。

一个成功的控制是“有效的”提交。每个成功的控件都将其控件名称与其当前值配对,作为提交的表单数据集的一部分。成功的控件必须在 FORM 元素中定义并且必须具有控件名称。

然而:

  • 禁用的控件无法成功。
  • 如果一个表单包含多个提交按钮,则只有激活的提交按钮才能成功。
  • 所有“打开”复选框都可能成功。
  • 对于共享相同 name 属性值的单选按钮,只有“on”单选按钮可能会成功。
  • 对于菜单,控件名称由 SELECT 元素提供,值由 OPTION 元素提供。只有选定的选项可能会成功。如果没有选择任何选项,则控件不成功,并且在提交表单时不会将名称和任何值提交给服务器。
  • 文件选择的当前值是一个或多个文件名的列表。提交表单后,每个文件的内容与表单数据的其余部分一起提交。文件内容根据表单的内容类型打包。
  • 对象控件的当前值由对象的实现决定。

如果提交表单时控件没有当前值,则用户代理不需要将其视为成功的控件。

此外,用户代理不应认为以下控制成功:

  • 重置按钮。
  • 已设置声明属性的 OBJECT 元素。

隐藏控件和由于样式表设置而未呈现的控件可能仍会成功。

你的问题实际上是 Angular。 显然,它没有设置value隐藏输入。