mongooseでsaveすると上書きされる。または追加されない。

先日勉強会の時にうっかり説明出来ていなくてハマってしまったので書いておきます。

もしかしたら同じようなミスをしてしまっている人もいるかもなので(^_^;

どういうことなのか

var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var UserSchema = new Schema({
    name : String,
});
var UserModel = mongoose.model('users', UserSchema);
var user = new UserModel(req.body);

router.post('/comit', function(req, res, next) {
  user.name = req.body.name;
  user.save(function(err) {
    if(err) console.log(err);
    res.redirect('/');
  })
});

単純にnew UserModelをグローバルに書いてしまってました(^_^;

user.save()をするとデータは保存されますが、再度postで/comitすると上書きされてしまいます。

そりゃそうですよね。userオブジェクトがグローバルで作成してそのデータを上書きしてsaveしているわけですからmongoのデータが上書きされるわけです。

正しい記述

router.post('/comit', function(req, res, next) {
  var user = new UserModel();
  user.name = req.body.name;
  user.save(function(err) {
    if(err) console.log(err);
    res.redirect('/');
  })
  //
});

new UserModel()を/comit処理の中に記述してやれば問題は解決します。

/comitにpostされる度にuserオブジェクトは新しく作られます。

新しく作られたuserオブジェクトにsave()したら新しくデータが入るのは感覚的にわかっていただけるかと。

ちなみにもし暗号化しない場合は下記のような記述で短縮することも出来ます。

var user = new UserModel(req.body);

誰にでもミスはあるモノです(^_^;

あわせて読みたい