我正在開發mongoose/node.js/express應用程序。Mongoose model.save()不會更新到數據庫
在我的路線我使用express' app.param()方法讓我的模型實例進入請求 - 而不是在每個控制器操作中獲取它。
我得到show
和create
在我的控制器中工作的操作 - 但是我卡住實施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);
});
}
你可以顯示設置'req.mymodel'的代碼嗎? – robertklep
不可否認,當我有多個類似命名的集合(並且忘記了Mongoose對集合的自動命名約定)時,我錯誤地多次查看錯誤的集合。 – WiredPrairie
WiredPrairie:我確定它是正確的集合,我只有2個atm;)@robertklep:更新了該代碼部分的問題 – tmaximini