Estoy haciendo una aplicación de tareas pendientes en nextjs para practicar, y me está costando mucho eliminar todos de la base de datos usando la función deleteOne.
Aquí está la llamada desde el frente:
async function deleteTodo(id) { await fetch(`/api/todos/${id}`, { method: "DELETE", }); setTodosList(todosList.filter((todo) => todo._id !== id)); }y aquí está el manejo del método DELETE:
async function handler(req, res) { let client; try { client = await connectDatabase(); } catch (error) { res .status(500) .json({ message: error.message || "Error connecting to MongoDB." }); return; } if (req.method === "DELETE") { const { id } = req.query; console.log(id); if (!id || id.trim() === "") { res .status(500) .json({ message: "A todo id was not sent with the request." }); client.close(); return; } try { let result; let allTodos; result = await deleteTodo("todos", id); allTodos = await getAllTodos("todos"); res.status(201).json({ message: `Todo ${id} successfully removed!`, todos: allTodos, }); } catch (error) { res .status(500) .json({ message: error.message || "Unable to delete todo." }); } } client.close(); }y la función de ayuda deleteTodo llama:
export async function deleteTodo(collection, id) { const client = await connectDatabase(); const db = client.db(); const result = await db.collection(collection).deleteOne({ _id: id }); return result; }Puedo hacer que elimine el primer elemento en la matriz de todos si le paso a deleteOne un objeto vacío, pero cuando trato de especificar la identificación usando { _id: id } no se elimina.
¿Alguien puede ver lo que está sucediendo para causar esto? Gracias.
Creo que su id pasada desde front-end tiene un tipo de string . Dado que _id tiene el tipo ObjectId, debe convertir la cadena de id en ObjectId.
Instalar:
npm i bson Importa en tu deleteTodo :
import { ObjectId } from 'bson'; e intenta cambiar, en deleteTodo
const result = await db.collection(collection).deleteOne({ _id: ObjectId(id) });