2016-07-24 8 views
0

データを取り込んでDBに格納し、編集して削除するAPIを作成しています。私は特定の属性だけを更新できるようにしたいと思っています。ユーザーが属性を送信しない場合、コードはDBに既にデータを保存しておきたいと思います。代わりに、属性を送信しないと空のデータで上書きされます。ここでapiを追加/編集/削除すると、ユーザーの更新データがDBノードのデータを上書きする

は例です:

router.post('/update', function (req, res) { 



var first_name = req.body.first_name, 
last_name = req.body.last_name, 
email = req.body.email, 
phone_number = req.body.phone_number, 
clas = req.body.clas, 
subject = req.body.subject, 
teacher_id = req.body.teacher_id; 


    req.assert('teacher_id', 'Invalid teacher_id').notEmpty(); 
    var errors = req.validationErrors(); 
if (errors) { 
res.json(400, {success: false, message: "please enter your teacher_id "}); 
return; 
} 



Teacher.findOne({_id: teacher_id}, function (err, teacher) { 
if (err) { 
    console.log(err); 
} else { 

    teacher.first_name = first_name != null || first_name 
    != undefined ? first_name : teacher.first_name; 

    teacher.last_name = last_name != null || last_name 
    != undefined ? last_name : teacher.last_name; 

    teacher.email = email != null || email 
    != undefined ? email : teacher.email; 

    teacher.phone_number = phone_number != null || phone_number 
    != undefined ? phone_number : teacher.pickup_points; 

    teacher.clas = clas != null || clas 
    != undefined ? clas : teacher.clas; 

    teacher.subject = subject != null && subject 
    != undefined ? subject : teacher.subject; 

    teacher.save(function (err, teacher) { 
     if (err) { 
      console.log(err); 
     } else { 

      res.json({success: true, message: "teacher successfully updated"}); 
     } 
    }); 

} 
}); 
}); 

答えて

0

この方法は、あなたがやっていることは少々異なっていますが、一つの場所とコールであなたの文書モデルを保つことができるように、私はあなたにこの方法をお勧めしますあなたがそれらを必要とするときはいつでも。検証部分は、マングース用の別のモジュールを使用して処理できます。

私はfindoneを使用してドキュメントを取得していますようにあなたが更新している方法は、それは、それがあるように、他の変数が割り当てられることを期待し、その後= newobjectname.valueobjectname.value

これはfindoneandupdateを使用することになり解決する簡単な方法。

modelname.findOneAndUpdate({ 
primarykey: primarykey 
}, { 
$set: { 
nameindocument: valuetobereplace 
//you can add here values that you would like to change 
} 
}, { 
new: true //new:true here helps to get updated object in return 
}, function(err, doc) { 
if (err) { 
console.error("Error:" + err); 
} else { 
} 
}); 
+0

このメソッドを使用する場合、Mongooseはモデルの検証を実行しません。この場合、手動で検証してください。 – Paul

+0

@Paul私は検証の問題に対処するために1つの余分なモジュールを使用し、スキーマを定義する際に使用するようにします。それのどこが悪いんだい? downvoteの価値がない、それとも? –

+0

解決策の主なテキストには、現在のアプローチ(つまり、 '.save()' vice '、 'findOneAndUpdate()')を使用する動作の側面が含まれていないことに言及する価値があります。私は余分なモジュールを使用してあなたをdownvoteしませんでした。あなたはあなたの解決策にそれについて言及しませんでした。 – Paul

0

これは唯一の方法ではないかもしれませんが、私はLodashライブラリを使ってこのようなことを容易にしています。私はまた、コールバックを保存するために私のオブジェクトでリクエストを設定するために 'param'ルートを使用します。

const _= require("lodash ") 
router.param("teacherId", function(id, req,res,next){ 
    Teacher.findOne({_id : id}, function(e, teacher){ 
     //add error handling of your choice 
     req.teacher = teacher; 
     next(); 
    }) 
}) 


router.put("teacher/:teacherId", function(req,res){ 
    var updates = _.pick(req.body, ["name","age"]; // whitelist allowed attribute names to change 

    var teacher = _.merge(req.teacher, updates); 
    teacher.save(function(e){ 
     // handle your response. 
    }) 
}) 

/*編集*/

また、このソリューションでは、私は(合理的に標準)REST形式のルートの使用を想定していますのでご注意下さい。 router.post('/update'...をそのまま使用したいのであれば、私のように先生の質問を分けることはできません。

私がやったやり方の利点は、まず先のことを見つけたい(たとえば、先生の表示、先生の削除など)場合は、その場で行うロジックがあります。他のハンドラーでそれを繰り返さなければなりません。

関連する問題