Подтвердить что ты не робот

Обновить модель с помощью 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")
4b9b3361

Ответ 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);
});