无法从 nextjs 应用中的 mongoDB 中通过 id 删除单个项目

Can't get single item to delete by id from mongoDB in nextjs app

我正在 nextjs 中制作一个待办事项应用程序进行练习,我很难使用 deleteOne 函数从数据库中删除单个待办事项。

这是前端的调用:

async function deleteTodo(id) {
    await fetch(`/api/todos/${id}`, {
      method: "DELETE",
    });
    setTodosList(todosList.filter((todo) => todo._id !== id));
  }

下面是 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();
}

及其调用的 deleteTodo 辅助函数:

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;
}

如果我向 deleteOne 传递一个空对象,我可以让它删除 todos 数组中的第一项,但是当我尝试使用 { _id: id } 指定 id 时,它不会删除。

谁能看出是什么原因造成的?谢谢

我认为从 front-end 传递的 id 具有 string 类型。由于 _id 具有 ObjectId 类型,因此需要将 id 字符串转换为 ObjectId。

安装:

npm i bson

在您的 deleteTodo 中导入:

import { ObjectId } from 'bson'; 

并尝试改变,在deleteTodo

const result = await db.collection(collection).deleteOne({ _id: ObjectId(id) });