es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo eliminar las publicaciones marcadas como favoritas del usuario (1) de la pestaña del usuario (2) después de que el usuario (1) elimine su cuenta?

Después de crear un API REST de node.js, express, mongoDb para una aplicación web de redes sociales con casi todas las acciones básicas de redes sociales (iniciar sesión, registrarse, agregar una publicación, eliminar una publicación, eliminar cuenta, seguir usuarios …), actualmente me enfrento a un problema, donde después de implementar la función de marcador de una publicación, no logro encontrar una solución para eliminar una publicación marcada de la página de publicaciones marcadas de otro usuario después de que el primer usuario elimine su cuenta. A continuación, proporcionaré mi código:

(N. B. Los marcadores son una matriz dentro del modelo de Usuario. También me gustaría mencionar los pasos que inicialmente planeé para la tarea:
1. Obtener el usuario actual por ID
2. Luego obtener todas las publicaciones creadas por este usuario, lo cual devuelve una matriz, por lo que la mapeé para obtener el ID de cada publicación
3. Después de eso, obtuve todos los usuarios en la aplicación originalmente planeados para comparar las publicaciones que se encuentran dentro de la matriz de marcadores de cada usuario con las publicaciones que el usuario actual ha creado. Luego, habría eliminado estas mismas publicaciones de la matriz de marcadores de cada uno de estos usuarios.
–> Creo que la lógica que he analizado es mantenible, pero simplemente no está funcionando conmigo. A continuación se muestra el código:

export const eliminarUsuario = async (req, res) => {
    try {
    
        let usuario = await User.findById(req.params.userId)
    
        const publicacionesUsuario = await Post.find({ creatorId: usuario._id })
    
        const todosUsuarios = await User.find()
        const idsMisPublicaciones = publicacionesUsuario.map((publicacion) => publicacion._id.toString())

// Esta es la sección que he implementado para mi tarea, pero obviamente algo no está bien

        await Promise.all(
            idsMisPublicaciones.forEach((id) =>
                todosUsuarios.map((usuario) => {
                    usuario.bookmarks.includes(id) &&
                        usuario.updateOne({ $pull: { bookmarks: id } })
                })
            )
        )
    
        await Post.deleteMany({ creatorId: usuario._id })
        await usuario.remove()
    
        res.status(200).json({
            message: "¡La cuenta ha sido eliminada con éxito!",
        })
    
    } catch (err) {
        errorHandler(res, err)
    }
}

}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para eliminar las publicaciones marcadas de los marcadores de otro usuario

    Después de examinar el código proporcionado, parece que la lógica prevista es correcta para eliminar las publicaciones marcadas de otros usuarios. Sin embargo, hay un problema al usar forEach dentro de Promise.all, ya que forEach no devuelve una promesa.

    Una posible solución sería usar map en lugar de forEach y luego filtrar cualquier arreglo vacío que pueda resultar de no tener ninguna publicación marcada para eliminar. El código actualizado se vería así:

    export const deleteUser = async (req, res) => {
        try {
            let user = await User.findById(req.params.userId);
    
            const userPosts = await Post.find({ creatorId: user._id });
    
            const allUsers = await User.find();
            const myPostsIds = userPosts.map((post) => post._id.toString());
    
            // Usar map en lugar de forEach para devolver un arreglo de promesas
            const promises = myPostsIds.map((id) =>
                Promise.all(
                    // Filtrar cualquier arreglo vacío
                    allUsers
                        .filter((u) => u.bookmarks && u.bookmarks.length)
                        .map((user) => {
                            // Verificar si el usuario ha marcado la publicación y eliminarla
                            if (user.bookmarks.includes(id)) {
                                return user.updateOne({ $pull: { bookmarks: id } });
                            }
                        })
                )
            );
    
            // Esperar a que todas las promesas se resuelvan antes de continuar
            await Promise.all(promises);
    
            await Post.deleteMany({ creatorId: user._id });
            await user.remove();
    
            res.status(200).json({
                message: "¡La cuenta ha sido eliminada correctamente!",
            });
        } catch (err) {
            errorHandler(res, err);
        }
    };
    

    Esto debería eliminar correctamente cualquier publicación marcada de los marcadores de otros usuarios cuando se elimine la cuenta del usuario actual.

Comments are closed.