Soy nuevo en Express y MongoDB. Creé una pequeña aplicación web en Node.js y estoy usando Express.js y Mongoose. Puedo crear un usuario con éxito y hacer que un usuario inicie sesión, pero tengo problemas para que un usuario pueda eliminar su cuenta.
Tengo un archivo user.js en mi carpeta de rutas, que es donde escribo el código para registrarme, iniciar sesión, eliminar, etc. Aquí hay un enlace al proyecto en GitHub ( https://github.com/NicholasGati/shopping- carro-2 ). El botón para eliminar la cuenta de un usuario se encuentra en views/user/edit.hbs. Puse el botón en un formulario. Cuando hago clic en el botón, el usuario no se elimina y se me redirige a '/' por algún motivo. Nota: '/:id' en mi archivo route/user.js se convierte en '/user/:id'.
Aquí está el código en el archivo route/user.js para el método de eliminación:
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"); }); });Aquí está el formulario en vistas/usuario/editar.hbs:
<form action="/user/{{user.id}}" method="delete"> <div class="form-group"> <button type="submit" class="btn btn-danger">Delete Account</button> </div> </form>Además, aquí está la función isLoggedIn:
function isLoggedIn(req, res, next) { if (req.isAuthenticated()) { return next(); } res.redirect("/"); }Como eres nuevo, creo que debería guiarte para encontrar el problema tú mismo :)
Si el marcado no parece correcto, lo siento porque estoy usando mi teléfono para publicar esta respuesta.
Tuve exactamente el mismo problema. Usé un XMLHttpRequest del lado del cliente para hacer esto. Lo siento, no tengo la experiencia suficiente para explicar por qué funcionó de esta manera y no desde el final del nodo, pero puede tener que ver con que los datos del formulario están diseñados inherentemente para pasar información, no para eliminarla. En cualquier caso, prueba esta solución.
Su código de botón (la acción del formulario no debería importar y, de hecho, la etiqueta tampoco debería importar, ya que la lógica se maneja en el JS, pero esto es lo que usé):
<a href="/user/{{user.id}}"><button id = "del-btn" class="btn btn-danger">Delete</button></a>Script para enviar una solicitud HTTP desde el clic del botón, este código debe ir en el mismo archivo que su botón anterior, o como un archivo JS incluido que la página HTML ha importado:
<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>en la ruta del lado del servidor, observe cómo la respuesta es solo un código de éxito. Es la solicitud XMLHTTP del lado del cliente la que realiza la redirección:
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(); }); });