Mongoose model.save()在更新时不会持久保存到数据库

时间:2013-10-30 10:43:13

标签: node.js mongodb express mongoose

我正在开发一个mongoose / node.js / express app。

在我的路由中我使用express' app.param()方法将模型实例放入请求中 - 而不是在每个控制器操作中获取它。

我在我的控制器中执行了showcreate次操作 - 但是我无法执行update操作。

这是我的相关控制器代码:

// mymodel-controller.js
var mongoose = require('mongoose')
var MyModel = mongoose.model('MyModel');
var utils = require('../../lib/utils');

"use strict";

exports.update = function (req, res, next) {

  var mymodel = req.mymodel;
  mymodel.set(req.body);
  mymodel.slug = utils.convertToSlug(req.body.title);

  mymodel.save(function(err, doc) {
    if (!err) {
      console.log('update successful');
       // here i see the correctly updated model in the console, however the db is not updated
      console.dir(doc); 
      return res.redirect('/mymodels/' + mymodel.slug);
    } else {
      console.error('update error', err);
      return res.render('mymodels/edit', {
        title: 'Edit Model',
        model: mymodel,
        errors: err.errors
      });
    }
  });
}

奇怪的是,猫鼬保存成功,我没有任何错误。 我看到'更新成功'和正确更新的模型打印在控制台上,但没有保留在数据库中。 我尝试在更新和保存模型之前手动获取模型,而不是使用app.param(..),但我有相同的效果。 知道我在这里缺少什么吗?

更新

这是我设置req.mymodel - 更长路由文件的一部分的代码。 在我的节目中,例如我也使用req.mymodel来显示它,它到目前为止工作正常。

/**
 * mymodel ROUTES
 */
app.param('mymodel', function(req, res, next, id){
  MyModel.findOne({ 'slug': id }, function(err, mymodel) {
    if (err) {
      next(err);
    } else if (mymodel) {
      req.mymodel = mymodel;
      next();
    } else {
      res.status(404).render('404', {title: "Not found", errorMessage: "The requested mymodel was not found."});
    }
  });
});
app.get('/mymodels',                 mymodelsController.index);
app.get('/mymodels/new',             mymodelsController.new);
app.post('/mymodels',                mymodelsController.create);
app.get('/mymodels/:mymodel',        mymodelsController.show);
app.get('/mymodels/:mymodel/edit',   mymodelsController.edit);
app.put('/mymodels/:mymodel',        mymodelsController.update); // that's the one not working with the code above
app.del('/mymodels/:mymodel',        mymodelsController.destroy);

UPDATE2

另一方面,此代码在我的控制器中工作并更新数据库(我更喜欢使用instance.save())

exports.update = function (req, res, next) {

  var mymodel = req.param('mymodel');


  var query = { slug: mymodel };

  var update = {};
  update.title = req.param('title');
  update.body = req.param('body');
  update.points = req.param('points');
  update.location = req.param('location');
  update.slug = utils.convertToSlug(req.param('title'));

  MyModel.update(query, update, function (err, numAffected) {
    if (err) return next(err);

    if (0 === numAffected) {
      return next(new Error('no model to modify'), null);
    }

    res.redirect('/mymodels/' + update.slug);
  });
}

1 个答案:

答案 0 :(得分:2)

问题确实是我在路线中设置req.param值的方式。

而不是在我的路线文件中执行此操作:

app.param('mymodel', function(req, res, next, id){
  MyModel.findOne({ 'slug': id }, function(err, mymodel) {
    if (err) {
      next(err);
    } else if (mymodel) {
      req.mymodel = mymodel;
      next();
    } else {
      res.status(404).render('404', {title: "Not found", errorMessage: "The requested mymodel was not found."});
    }
  });
});

我必须声明每次加载实例的控制器操作,例如

app.param('mymodel', mymodelController.load);

this example中看起来很像。