2017-01-01 3 views
0

Я новичок в Express и MongoDB. Я создал небольшое веб-приложение в Node.js и использую Express.js и Mongoose. Я могу успешно создать пользователя и войти в систему, но у меня возникают проблемы с тем, что пользователь может удалить свою учетную запись.Удалить пользователя с помощью Mongoose, Express

У меня есть файл user.js в папке маршрутов, где я пишу код для регистрации, подписания, удаления и т. Д. Вот ссылка на проект на GitHub (https://github.com/NicholasGati/shopping-cart-2). Кнопка для удаления учетной записи пользователя находится в представлении/user/edit.hbs. Я положил кнопку в форме. Когда я нажимаю кнопку, пользователь не удаляется, и я по какой-то причине перенаправляется на «/». Примечание: «/: id» в моих маршрутах/файл user.js становится «/ 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. Вызовите маршрут для удаления пользователя.

Если разметка не выглядит правкой, я сожалею, что использую свой телефон, чтобы опубликовать этот ответ.

+0

Большое вам спасибо Saeid! Я подумал о первом моменте проверки метода формы и метода method = "post" вместо метода = "удалить" и изменил route.delete() на route.post() в файле routes/user.js. Затем я добавил скрытое поле в форме с токеном csrf, и оно сработало! Спасибо, что вел меня в правильном направлении. –

+0

Ваш прием @ Николас Гати. Я думаю, вы также можете использовать метод 'delete'. –

+0

И если вы чувствуете, что ответ поможет вам решить вашу проблему, лучше будет голосовать. –

0

У меня была такая же проблема. Для этого я использовал XMLHttpRequest с клиентской стороны. Мне жаль, что я недостаточно опытен, чтобы объяснить, почему это сработало таким образом, а не с конца узла, но, возможно, это связано с тем, что данные формы изначально предназначены для передачи информации, а не для удаления информации. В любом случае попробуйте это решение.

В клиентском коде на стороне:

Ваш код кнопки (форма действия не имеет значения, и в этом отношении, тег не должен либо, так как логика обрабатывается в JS, но это то, что Я использовал):

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

Скрипт для отправки запроса HTTP от нажатия кнопки, этот код должен идти в том же файле, ваша кнопка выше, или как включить JS файл, что страница HTML импортировала:

<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. Как ни странно, методы «удалить» не сработали, но когда я изменил их на «пост», все это работало нормально. Я до сих пор не знаю, почему это так, но, изменив файл route/user.js, чтобы использовать router.post() и method = 'post' в форме, пользователь был успешно удален. Я также должен был добавить маркер csrf в форме как скрытое поле. Спасибо за ваш ответ! –

Смежные вопросы