2017-01-01 54 views
0

我是Express和MongoDB的新手。我在Node.js中創建了一個小型Web應用程序,並使用Express.js和Mongoose。我可以成功創建一個用戶並讓用戶登錄,但我無法刪除用戶的帳戶。用Mongoose,Express刪除一個用戶

我在我的路由文件夾中有一個user.js文件,這是我在寫代碼註冊,登錄,刪除等的位置。這是GitHub上的項目鏈接(https://github.com/NicholasGati/shopping-cart-2)。刪除用戶帳戶的按鈕位於views/user/edit.hbs中。我把按鈕放在一個表格中。當我點擊按鈕時,用戶不會被刪除,並且出於某種原因我被重定向到「/」。注意:我的routes/user.js文件中的'/:id'變成'/ user /:id'。

下面是刪除方法中的路由/ user.js的文件中的代碼:

router.delete('/:id', isLoggedIn, (req, res, next) => { 
    User.findOneAndRemove({_id: req.params.id}, (err) => { 
    if (err) { 
     req.flash("error", err); 
     return res.redirect("/user/edit"); 
    } 

    req.flash("success", "Your account has been deleted."); 
    req.logout(); 
    return res.redirect("/shop/coffee"); 
    }); 
}); 

以下是在視圖/用戶/ edit.hbs形式:

<form action="/user/{{user.id}}" method="delete"> 
    <div class="form-group"> 
    <button type="submit" class="btn btn-danger">Delete Account</button> 
    </div> 
</form> 

另外,這裏是isLoggedIn功能:

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()) { 
    return next(); 
    } 
    res.redirect("/"); 
} 

回答

3

既然你是新的,我想我應該引領你發現問題自己:)

  1. 請確認表單方法。
  2. 確保調用了用戶刪除的路由。

如果標記看起來不對,我很抱歉cas我正在使用我的手機發布此答案。

+0

非常感謝你Saeid!我想到你的第一點,檢查表單方法,並嘗試method =「post」而不是method =「delete」,並在我的routes/user.js文件中將route.delete()更改爲route.post()。然後,我用csrf標記在表單中添加了一個隱藏字段,它工作正常!感謝您帶領我朝着正確的方向前進。 –

+0

歡迎@NicholasGati。我想你也可以使用'delete'方法。 –

+0

如果您覺得答案可以幫助您解決問題,那麼最好是進行投票。 –

0

我有這個完全相同的問題。我使用客戶端的XMLHttpRequest來執行此操作。我很抱歉,我沒有足夠的經驗來解釋爲什麼它以這種方式工作,而不是從節點端來解釋,但它可能與表單數據本身被設計爲傳遞信息而不是刪除信息有關。無論如何,試試這個解決方案。

在您的客戶端代碼:

按鈕代碼(表單操作不應該的問題,並就此而言,標籤不應該,因爲相關的邏輯在JS處理,但這是什麼我用):

<a href="/user/{{user.id}}"><button id = "del-btn" class="btn btn-danger">Delete</button></a> 

腳本從按鈕點擊發送HTTP請求,這個代碼應該在同一個文件你的按鈕上面去,或者作爲包括在HTML頁面已經進口的JS文件:

<script> 
     var del_btn = document.getElementById("del-btn"); 
     del_btn.addEventListener("click", function(e) { 

      var user = <%- JSON.stringify(user) %>; 
      var xhr = new XMLHttpRequest(); 
      xhr.open("DELETE", "/user/" + user._id); 
      xhr.onreadystatechange = function() { 
       if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { 
        console.log(xhr.responseText); 
        window.location.href = "/users"; 
       } 
      }; 
      xhr.send(); 


      //make XMLHttpRequest to delete the poll here 
     }, false); 
</script> 

在您的服務器端路由,請注意響應如何只是一個成功的代碼。這是來自客戶端的XMLHTTP請求重定向:

app.delete('/user/:id', isLoggedIn, function(req,res){ 
      User.remove({ 
      _id: req.params.id, 
      ownerID: req.user._id 
      }, function (err, user) { 
      if (err) 
       return console.error(err); 

      console.log('User successfully removed from polls collection!'); 
      res.status(200).send(); 


      }); 

    }); 
+1

謝謝Shazam。奇怪的是,'刪除'方法不起作用,但當我將它們更改爲'發佈'時,它一切正常。我仍然不確定這是爲什麼,但是由於將路由/ user.js文件更改爲在表單中使用router.post()和method ='post',用戶已成功刪除。我也必須在表單中添加一個csrf標記作爲隱藏字段。感謝您的答覆! –