2

この質問に対する答えを見つけることができませんでした。NodeJS、Express、および Express Bodyparser を使用している場合、およびその他の MEAN スタックを使用している場合、非表示フィールドと無効フィールドの両方で問題が発生します。フォームを送信するときに、これらのフィールドが req.body オブジェクトに表示されません。

私の理解が正しければ、express の bodyparser の側面は実際には別のプロジェクトから取られています。とにかく、これらのフィールドが削除された理由や、これを防ぐ方法を実際に理解することはできませんでした. メソッドオーバーライドと関係があるのではないかと思いますが、これを有効/無効にしても問題のフィールドには影響しません。

だから..私自身と将来のグーグルのために:ここで何が起こっているのですか?

リクエストに応じて、いくつかのコードを次に示します: 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);

ユーザールート:

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

1 に答える 1

5

Expressとは関係ありません。成功したコントロールのみがシリアル化され、フォームが送信されたときにブラウザーによって送信されます。

HTML 仕様は、コントロールを成功させるものを定義します。

成功したコントロールは、送信に対して「有効」です。成功したすべてのコントロールには、送信されたフォーム データ セットの一部として、現在の値とペアになっているコントロール名があります。正常なコントロールは FORM 要素内で定義する必要があり、コントロール名が必要です。

でも:

  • 無効になっているコントロールは成功しません。
  • フォームに複数の送信ボタンが含まれている場合、アクティブ化された送信ボタンのみが成功します。
  • すべての「オン」チェックボックスが成功する可能性があります。
  • name 属性の同じ値を共有するラジオ ボタンの場合、"on" ラジオ ボタンのみが成功する可能性があります。
  • メニューの場合、コントロール名は SELECT 要素によって提供され、値は OPTION 要素によって提供されます。選択したオプションのみが成功する可能性があります。オプションが選択されていない場合、コントロールは成功せず、フォームの送信時に名前も値もサーバーに送信されません。
  • ファイル選択の現在の値は、1 つ以上のファイル名のリストです。フォームが送信されると、各ファイルの内容が残りのフォーム データと共に送信されます。ファイルの内容は、フォームのコンテンツ タイプに従ってパッケージ化されます。
  • オブジェクト コントロールの現在の値は、オブジェクトの実装によって決まります。

フォームが送信されたときにコントロールに現在の値がない場合、ユーザー エージェントはそれを成功したコントロールとして扱う必要はありません。

さらに、ユーザー エージェントは、次のコントロールが成功したと見なすべきではありません。

  • ボタンをリセットします。
  • 宣言属性が設定されている OBJECT 要素。

非表示のコントロールと、スタイル シートの設定が原因でレンダリングされないコントロールは、引き続き正常に動作する可能性があります。

あなたの問題は実際にはAngularです。 どうやらvalue、非表示の入力を設定していません。

于 2013-10-28T16:58:53.077 に答える