2017-01-15 15 views
0

mongodbで名前を更新する際に問題があります。名前は最初の変数には、ユーザーが保存され、次のように関数に渡されます。putAjax(editName)そして、それはここでは関数に行く:ノードエクスプレスでPUTを使用してmongoの名前を更新できません

function putAjax(editName) { 
    $.ajax({ 
      type: "PUT", 
      url: "/items/"+ editName, 
      data: editName, 
      dataType: 'json', 
     }) 
     .done(function(result) { 
      console.log("result:", result); 
      console.log("data successfully saved:"); 
     }) 
     .fail(function(jqXHR, error, errorThrown) { 
      console.log(jqXHR); 
      console.log(error); 
      console.log(errorThrown); 
     }); 
}; 

私は(結果)にconsole.logとIすることができます私は編集が行われたと仮定して、編集された名前を見ることができます。最後に、サーバー上でapp.putの呼び出しを行います

app.put('/items/:name', function(req, res) { 
    Item.find(req.params.name, function(err, items) { 
     if (err) { 
      return res.status(404).json({ 
       message: 'Internal Server Error' 
      }); 
     } 

     Item.findOneAndUpdate({ 
      name: req.params.name 
     }, { 
      $set: { 
       name: req.params.name 
      } 
     }, { new: true }, 
     function() { 
      res.json(items); 
     }); 
    }); 
}); 

これは、更新が発生していないようだところです。 mongoシェルを使用すると、私はまだ同じ名前を持っていて、編集された名前はありません。混乱する部分は、なぜconsole.log(結果)が私に編集した名前を表示するのかです。私は本当にこれに関する助けに感謝します。ありがとう。

答えて

1

データベースクエリに一意のキーを渡すことはありません。あなたは既存のレコードのデータベースに保存されている名前を変更するつもりですが、これをやっていません。代わりに、新しい名前の値と一致するレコードを検索しようとしていて、送信した値を常にサーバーに返します。

代わりに、AJAXリクエストで一意の識別子を渡す必要があります。URLを使用するのが最も合理的です。

function putAjax(id, editName) { 
    var payLoad = { name: editName }; 
    $.ajax({ 
    type: "PUT", 
    url: "/items/"+ id, 
    data: payLoad, 
    dataType: 'json', 
    }) 
    .done(function(result) { 
    console.log("result:", result); 
    console.log("data successfully saved:"); 
    }) 
    .fail(function(jqXHR, error, errorThrown) { 
    console.log(jqXHR); 
    console.log(error); 
    console.log(errorThrown); 
    }); 
}; 

サーバー側のコード:

app.put('/items/:id', function(req, res) { 
    var data = req.body; // data should be validated 
    Item.findOneAndUpdate({ _id: req.params.id } 
    , { $set: data } 
    , { returnOriginal: false } 
    , function (err, result) { 
     if (err) { 
     return res.status(500).json({ 
      message: 'Internal Server Error.' 
     }); 
     } 
     return res.json(result); 
    } 
); 
}); 
+0

ことを指摘してくれてありがとう。私は一日中このままでいましたが、データベースで検索するために元の値を渡す方法を理解できません。それはここに渡されるだろうか? app.put( '/アイテム/:名' クライアント側で、機能(reqは、解像度、データ) そして、私のAJAXは、次のようになります。 VAR OLDNAME = { "名前":OLDNAME}; $。アヤックス({ タイプ: "PUT"、 URL: "/アイテム/" + OLDNAME、 データ:OLDNAME、 データ型: 'JSON'、 })。 – marcusk7

+0

私はコードサンプルと私の答えを更新しました –

+0

ダンしかし、私の場合は、次のコードを変更して動作させる必要がありました:Item.findOneAndUpdate({name:req.params.id} 、{$ set:{name:data.name}}。 – marcusk7

関連する問題