2013-10-30 80 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); 

其中相當多的樣子。