2017-01-15 27 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(結果)和我可以看到編輯的名稱,所以我認爲編輯發生了。最後,它使呼叫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 shell時,我仍然擁有相同的名稱,而不是編輯的名稱。令人困惑的部分是,爲什麼console.log(result)顯示我編輯後的名稱。我真的很感激任何幫助。謝謝。

回答

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