2013-10-30 81 views
1

我正在开发mongoose/node.js/express应用程序。Mongoose model.save()不会更新到数据库

在我的路线我使用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); 
    }); 
} 
+0

你可以显示设置'req.mymodel'的代码吗? – robertklep

+1

不可否认,当我有多个类似命名的集合(并且忘记了Mongoose对集合的自动命名约定)时,我错误地多次查看错误的集合。 – WiredPrairie

+0

WiredPrairie:我确定它是正确的集合,我只有2个atm;)@robertklep:更新了该代码部分的问题 – tmaximini

回答

1

问题的确是我在路线中设置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."}); 
    } 
    }); 
}); 

我曾在this example申报,每次加载实例的控制器动作,像

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

其中相当多的样子。