Обновить модель с помощью Mongoose, Express, NodeJS
Я пытаюсь обновить экземпляр модели ( "Место" - я знаю, что это работает с других маршрутов) в MongoDB и потратил некоторое время, пытаясь это сделать правильно. Я также пытаюсь перенаправить на страницу, которая просматривает "место", чтобы просмотреть обновленные свойства.
Node v0.4.0, Express v1.0.7, Mongoose 1.10.0
Схема:
var PlaceSchema = new Schema({
name :String
, capital: String
, continent: String
});
Контроллер/маршрута:
app.put('/places/:name', function(req, res) {
var name = req.body.name;
var capital = req.body.capital;
var continent = req.body.continent;
Place.update({ name: name, capital: capital, continent: continent}, function(name) {
res.redirect('/places/'+name)
});
});
Я пробовал кучу разных способов, но, похоже, не могу получить его.
Кроме того, я не утверждаю, что три переменные {имя, капитал и континент} блокируют дальнейшие операции? Благодарю. Также приветствуется общая отладочная помощь. Console.log(имя) (прямо под декларацией) ничего не записывает.
Нефритовая форма:
h1 Editing #{place.name}
form(action='/places/'+place.name, method='POST')
input(type='hidden', name='_method', value='PUT')
p
label(for='place_name') Name:
p
input(type='text', id='place_name', name='place[name]', value=place.name)
p
label(for='place_capital') Capital:
p
input(type='text', id='place_capital', name='place[capital]', value=place.capital)
p
label(for='place_continent') Continent:
p
textarea(type='text', id='place_continent', name='place[continent]')=place.continent
p
input(type="submit")
Ответы
Ответ 1
Вам нужно найти документ перед обновлением:
Place.findById(req.params.id, function(err, p) {
if (!p)
return next(new Error('Could not load Document'));
else {
// do your updates here
p.modified = new Date();
p.save(function(err) {
if (err)
console.log('error')
else
console.log('success')
});
}
});
работает для меня в производственном коде, используя ту же настройку, что и у вас. Вместо findById вы можете использовать любой другой метод поиска, предоставляемый mongoose. Просто убедитесь, что вы извлекли документ перед его обновлением.
Ответ 2
Теперь, я думаю, вы можете это сделать:
Place.findOneAndUpdate({name:req.params.name}, req.body, function (err, place) {
res.send(place);
});
Вы также можете найти по id:
Place.findOneAndUpdate({_id:req.params.id}, req.body, function (err, place) {
res.send(place);
});
Ответ 3
Я думаю, ваша проблема в том, что вы используете node 0.4.0 - попробуйте перейти на 0.2.6, и он должен работать. В github есть проблема, когда bodyDecoder не заполняет поле req.body.variable в node >= 0.3.0.
Ответ 4
Итак, теперь можно найти напрямую по id, это для Mongoose v4
Place.findByIdAndUpdate(req.params.id, req.body, function (err, place) {
res.send(place);
});
Просто чтобы упомянуть, если вам нужен обновленный объект, вам нужно передать {new: true}
как
Place.findByIdAndUpdate(req.params.id, req.body, {new: true}, function (err, place) {
res.send(place);
});