2016-12-31 67 views
0

MEAN堆棧新手在這裏。我很難理解如何刪除在MEAN中的作品。我使用這個SO Q&Atutorial作爲指南,但是每當我測試它時,我都會收到一個錯誤,指出數據不能被刪除。有人能告訴我我做錯了什麼嗎?使用MEAN堆棧從MongoDB刪除數據

這裏是我的代碼:

控制器JS

$scope.deleteProduct = function (value, idx) { 

    var this_id = value._id; 

    // delete 
    $http.delete('/api/products/delete:' + this_id) 
     .success(function (data) { 
      console.log(data); 
     }) 
     .error(function (data) { 
      console.log('Error: ' + data); 
     }) 
} 

節點服務器

app.delete('/api/products/delete:', productController.delete); 

服務器的 「控制器」

module.exports.delete = function (req, res) { 
    Service.remove({ 
     _id: req.params._id 
    }, function (err, service) { 
     if (err) { 
      res.send(err); 
     } 
     else { 
      res.json({message: "Delete successful."}); 
     } 
    }); 
} 

這就是我對此的理解。它是否正確?

  1. 控制器JS得到要刪除的ID,並調用$ HTTP的刪除請求(?),使用所述ID和/api/products/delete:

  2. 節點服務器看到我所謂的「/ API /產品/刪除:」並請求傳遞到服務器的控制器完成請求。

  3. 服務器控制器刪除數據並返回狀態。

我哪裏出錯了?請幫忙。

此外,我看到一些帖子說$resource$http更好。爲什麼?

謝謝。

回答

2

我認爲你在這裏遇到了一些問題。

在Express中,爲了使用params,您需要在可以替換的路徑中放置一些東西。即/api/:id明確,不管你傳遞,所以如果你發送/api/1request.params.id是1

所以,第一個問題是你的路線替代:id

app.delete('/api/products/delete:', productController.delete);

塔也不代表任何東西表達出來。我想你想

app.delete('/api/products/:id', productController.delete);

現在req.params.id應該包含您發送的參數。注意我在這裏刪除下劃線。你可以使用

app.delete('/api/products/:_id', productController.delete);並保留下劃線,如果你喜歡。

第二個錯誤我認爲是你的Angular代碼。你有你的電話的:它應該只是

$http.delete('/api/products/' + this_id)

現在你發送與任何標識您要刪除,即

/api/products/1

現在快遞途徑獲取和可以將其映射到/api/products/:id並替換id,現在您的控制器應該可以工作。禁止任何其他問題。

編輯

我不是很熟悉的角度,但我認爲人們之所以都在說使用$resource是很容易。您可以直接在對象本身的對象(如 product.updateproduct.delete)上直接調用不同的HTTP動詞,而不是嘗試自己創建http調用。我相信除此之外還有很多其他功能,但它的內置於Angular中的功能可以被利用。我認爲其中一種捕獲方式是資源的URL必須在服務器上以特定的方式設置,但我相信有一種方法可以在Angular中覆蓋它們。

+0

非常感謝你的詳細解釋!這就是':'代表的。 :)他們從來沒有真正解釋過我發現的任何資源。我根據您的提示更改了代碼,現在他們的工作很完美。謝謝! –