web-dev-qa-db-ja.com

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)
});

});

さまざまな方法を試しましたが、うまくいかないようです。
また、3つの{名前、首都、大陸}変数を宣言して、さらなる操作をブロックする方法はありませんか?ありがとう。一般的なデバッグヘルプも歓迎します。 Console.log(name)(宣言のすぐ下)は何も記録しません。

玉形:

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")
21
JohnAllen

何かを更新する前にドキュメントを見つける必要があります。

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が提供する他の検索メソッドを使用できます。更新する前に、必ずドキュメントを取得してください。

37
schaermu

今、私はあなたがこれを行うことができると思う:

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);
});
22
k33g_org

これで、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);
});
4
Abhishek Gupta

私はあなたの問題はノード0.4.0を使用していることだと思う-それが機能するはずで0.2.6に移動してみてください。 bodyDecoderがノード> = 0.3.0のreq.body.variableフィールドに入力されない状態で、githubに記録された問題があります。

0
Chris