2017-05-22 10 views
0

私はUserモデルを持っています。ここでは、必要に応じてpasswordフィールドを置きます。問題は、passwordを送信せずにユーザーを更新しようとすると、passwordが必要であるため、エラーが発生するということです。Mongoose - PUTリクエストの.save()エラー

作成時にはpasswordを必須に設定するにはどうすればよいですか?これを拡張すると、要求の1から4の属性を受け取ることができるエンドポイントを作成するにはどうすればよいですか?

PUTエンドポイント

exports.putUsuario = function(req, res) { 
    Usuario.findById(req.user._id, function(err, usuario) { 
     if (err) 
      res.send(err); 

     if (usuario){ 
     // Update the existing beer quantity 
     usuario.password = req.body.password; 
     usuario.nome = req.body.nome; 
     usuario.sexo = req.body.sexo; 
     usuario.idade = req.body.idade; 

     // Save the beer and check for errors 
     usuario.save(function(err) { 
      if (err) 
       res.send(err); 

      res.json(usuario); 
     }); 
     } 
     else { 
     res.json(usuario); 
     } 
    }); 
}; 

エラーは、それが未定義/空の場合でも、毎回パスワードを設定している

{ 
    "errors": { 
    "password": { 
     "message": "Path `password` is required.", 
     "name": "ValidatorError", 
     "properties": { 
     "type": "required", 
     "message": "Path `{PATH}` is required.", 
     "path": "password" 
     }, 
     "kind": "required", 
     "path": "password" 
    } 
    }, 
    "message": "Usuario validation failed", 
    "name": "ValidationError" 
} 
+1

私は、あなたが「当たりセーブ」に基づき検証を無効にすることができるとは思わない:それはどちらかだすべての '(保存のために有効)' (そして 'create()')操作を実行するか、そうでない場合(この場合、必要に応じて手動で検証することができます)。おそらく、['findByIdAndUpdate'](http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate)を調べる価値があります。デフォルトでは、検証は_disabled_です。 – robertklep

+0

説明をありがとう、@robertklep。 'findByIdAndUpdate'に変更するとこのエラーが修正されました。しかし、これは 'Model.pre( 'save'、function())'ミドルウェアでは実行されていません。 – Minoru

+0

ああ、それは動作しません。しかし、呼び出される 'findOneAndUpdate'フックがあります。 – robertklep

答えて

3

ポストマンに戻りました。リクエストボディがそれを設定する前に、パスワードを持っている場合

テスト:

if (req.body.password) { 
    usuario.password = req.body.password; 
} 
+0

簡単に修正していただきありがとうございます。 @robertklepによって提案された 'findByIdAndUpdate'を試しましたが、ミドルウェアを変更してパスワードを変更するよう要求していました。 – Minoru

+0

問題ありません。これはうれしかったです。 –

+2

私は誤って 'save()'を使うと、パスワードが存在しなければならないと仮定しました。しかし、文書はすでに存在するため、内部的には更新として扱われます。 +1! – robertklep

関連する問題