Обновление модели с помощью Mongoose, Express, NodeJS - PullRequest
21 голосов
/ 17 февраля 2011

Я пытаюсь обновить инстанцированную модель («Место» - я знаю, что она работает по другим маршрутам) в MongoDB и потратил некоторое время, пытаясь сделать это правильно.Я также пытаюсь перенаправить обратно на страницу, которая просматривает «место» для просмотра обновленных свойств.

Узел 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)
});

});

Я пробовал несколько разных способов, но, похоже, не могу его получить.
Кроме того, я не объявляю блокировку трех переменных {name, capital и continent}дальнейшие операции?Благодарю.Общая помощь отладки также приветствуется.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")

Ответы [ 4 ]

37 голосов
/ 17 февраля 2011

Вы должны найти документ, прежде чем обновлять что-либо:

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.Просто убедитесь, что вы извлекаете документ перед его обновлением.

22 голосов
/ 05 февраля 2014

Теперь, я думаю, вы можете сделать это:

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);
});
4 голосов
/ 15 июня 2017

Так что теперь вы можете найти и обновить напрямую по 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);
});
0 голосов
/ 17 февраля 2011

Думаю, ваша проблема в том, что вы используете узел 0.4.0 - попробуйте перейти на 0.2.6 с тем, чтобы он работал. Существует проблема, зарегистрированная на github, когда bodyDecoder не заполняет поле req.body.variable в узле> = 0.3.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...