Después de crear una API REST de node.js, express, mongoDb para una aplicación web de redes sociales con casi todas las acciones básicas de las redes sociales (iniciar sesión, registrarse, agregar una publicación, eliminar una publicación, eliminar una cuenta, seguir a los usuarios...), Actualmente tengo un problema en el que, después de implementar la función de marcar una publicación, no puedo 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. Proporcionaré mi código a continuación: (PS Bookmarks es una matriz dentro del modelo de usuario. También me gustaría mencionar los pasos que inicialmente pretendía para la tarea:
Obtener usuario actual por ID
Luego obtenga todas las publicaciones creadas por este usuario, lo que devuelve una matriz, así que lo asigné para obtener cada ID de publicación
Después de eso, busqué a todos los usuarios de la aplicación e inicialmente tenía la intención de comparar las publicaciones que viven dentro de la matriz de marcadores dentro de cada usuario con las publicaciones que el usuario actual ha creado. Luego sacaría estas mismas publicaciones de la matriz de marcadores de cada uno de estos usuarios. --> Creo que la lógica que analicé es mantenible, pero simplemente no funciona conmigo. Este es el código a continuación:
export const deleteUser = async (req, res) => { probar {
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())//Esta es la sección que implementé para mi tarea, pero obviamente algo no está bien
await Promise.all( myPostsIds.forEach((id) => allUsers.map((user) => { user.bookmarks.includes(id) && user.updateOne({ $pull: { bookmarks: id } }) }) ) ) await Post.deleteMany({ creatorId: user._id }) await user.remove() res.status(200).json({ message: "Account has been deleted successfully!", }) } catch (err) { errorHandler(res, err) }}
Como mencioné en mis comentarios, el valor que pasa a Promise.all no es una matriz de Promise/matriz de funciones asíncronas.
El segundo error está dentro de la función forEach (actualmente) en .map() , no está devolviendo nada en la llamada de mapa.
Así que esto debería hacerlo:
// first convert all ids to a promise await Promise.all(myPostsIds.map(id => new Promise(resolve => { // during this, await every test and update return Promise.all(allUsers.map(user => new Promise(resolve => { // if it includes the id, cast the update and then resolve if (user.bookmarks.includes(id)) { // if found, resolve the promise for this user after the change user.updateOne({ $pull: { bookmarks: id } }).then(resolve) } else { // resolve directly if not found. resolve() } // when all users are done for this id, resolve the Promise for the given id }))).then(resolve) })))Un método más fácil de leer y más corto sería:
for (const id of myPostIds) { for (const user of allUsers) { if (user.bookmarks && user.bookmarks.includes(id)) { await user.updateOne({ $pull: { bookmarks: id } }); } } }