在 Deno 中如何使用 MongoDB 进行数据持久化?

在现代化的网络应用程序中,数据持久化是不可少的一个组成部分,尤其是全栈开发。过去在 Node.js 中,我们可以使用 Mongoose 来处理 MongoDB 数据库。现在在 Deno 中,我们也可以使用现代的 MongoDB 驱动程序来实现这一点。

在本文中,我们将学习在 Deno 中使用 MongoDB 数据库的过程。在这里,我们将学习如何在 Deno 中使用 MongoDB 驱动程序,以及如何构建 RESTful API 来向数据库中插入、删除、更新和获取数据。同时,我们也将了解如何操作 MongoDB 的数据库、集合和文档。本文的实现过程会以一个简单的 Todo 应用程序为例。

准备工作

在开始之前,我们需要做些准备工作。首先,确保您已经安装了 Deno 运行时环境。其次,我们需要安装 MongoDB 驱动程序,以便在 Deno 中与 MongoDB 数据库进行通信。

为此,我们可以使用以下命令来安装 MongoDB 驱动程序:

此命令会安装一个稳定的 Deno CRUD 库作为 MongoDB 驱动程序。我们在引入驱动程序时将使用这个库。此外,我们还需要在本地主机上安装 MongoDB 数据库。

连接 MongoDB 数据库

在我们尝试连接 MongoDB 数据库之前,我们需要配置与数据库的连接。为此,我们可以创建一个 db.ts 文件,并在其中添加以下代码来设置连接:

import { MongoClient } from "https://deno.land/x/mongo/mod.ts";

const client = new MongoClient();
await client.connect("mongodb://localhost:27017");

const db = client.database("<YOUR_DB_NAME>");

export default db;

在这里,我们使用 MongoClient 类来创建一个名为 client 的数据库连接。然后,我们调用 connect 方法并传递连接数据库的 URL,该 URL 采用 MongoDB 的默认端口号 27017。最后,我们使用 database 方法获取指定的数据库实例,并将其导出为 db 变量。请注意,需要将 <YOUR_DB_NAME> 替换为实际的数据库名称。

操作 MongoDB 数据库

现在我们已经成功连接了数据库。但是,在我们使用之前,我们需要了解如何在 MongoDB 中操作数据库、集合和文档。在这里,我们将介绍一些 MongoDB 的基本操作。

创建集合

在 MongoDB 中,不需要事先创建集合,而是在向集合中添加文档时会自动创建集合。但是,如果我们希望事先创建一个集合,则可以使用以下代码:

import db from "./db.ts";

await db.createCollection("<COLLECTION_NAME>");

在上面的代码中,我们使用 createCollection 方法创建了一个名为 <COLLECTION_NAME> 的集合。

向集合中插入文档

插入文档是 MongoDB 中的一项重要操作。下面的代码演示了如何将一个名为 todos 的集合中插入一个名为 todoRecord 的文档:

import db from "./db.ts";

await db.collection("todos").insertOne({
  title: "Buy Groceries",
  description: "Buy milk, bread and eggs",
  date: new Date(),
  done: false,
});

在上面的代码中,我们使用 insertOne 方法将一个简单的 JSON 对象插入到 todos 集合中。请注意,我们可以指定文档的属性,包括一个标题、一个描述、日期和一个名为 done 的布尔属性。

从集合中检索文档

检索文档是 MongoDB 中常用的另一个操作。下面的代码演示了如何从 todos 集合中检索所有未完成的任务:

import db from "./db.ts";

const todos = await db.collection("todos").find({ done: false });
console.log(todos);

在上面的代码中,我们使用 find 方法从 todos 集合中检索未完成的任务。请注意,我们可以指定检索条件作为一个过滤器对象,该对象将用于匹配所有符合条件的文档。在这里,我们使用 { done: false } 作为过滤器对象,以匹配 done 属性为 false 的所有文档。

更新文档

更新文档是 MongoDB 中广泛使用的操作之一。下面的代码演示了如何将一个名为 todoRecord 的文档的 done 属性从 false 更新为 true

import db from "./db.ts";

await db.collection("todos").updateOne(
  { title: "Buy Groceries" },
  { $set: { done: true } },
);

在上面的代码中,我们使用 updateOne 方法更新 todos 集合中一个名为 Buy Groceries 的文档。请注意,我们使用 $set 操作符将 done 属性设置为 true

删除文档

删除文档是 MongoDB 中的另一个操作。下面的代码演示了如何从 todos 集合中删除所有已完成的任务:

import db from "./db.ts";

await db.collection("todos").deleteMany({ done: true });

在上面的代码中,我们使用 deleteMany 方法从 todos 集合中删除所有已完成的任务。请注意,我们使用 { done: true } 作为过滤器对象,以匹配所有具有 done 属性为 true 的文档。

构建 Todo RESTful API

现在,我们已经学会了如何在 Deno 中使用 MongoDB 驱动程序和一些 MongoDB 基本操作。下面,我们将使用这些概念来构建一个 Todo RESTful API,并实现向数据库中插入、删除、更新和获取数据。

定义 Todo 实体

首先,我们需要定义一个简单的 Todo 实体。这个实体将具有标题、描述、日期和完成状态属性。下面的代码演示了如何定义一个 Todo 实体类型:

interface Todo {
  _id: { $oid: string };
  title: string;
  description: string;
  date: Date;
  done: boolean;
}

在这里,我们定义了一个名为 Todo 的接口。每个 Todo 实体都将具有一个自动生成的 _id 属性。此外,它包括一个标题、一个描述、日期和一个名为 done 的布尔属性。

创建 Todo 控制器

现在我们已经定义了 Todo 实体,我们需要创建一个控制器来处理我们的 CRUD 操作。下面的代码演示了如何创建一个名为 todos.ts 的 Todo 控制器:

import { RouterContext } from "https://deno.land/x/oak/mod.ts";
import db from "../db.ts";
import { Todo } from "../entities/todo.ts";

const todos = db.collection<Todo>("todos");

export const getTodos = async (
  ctx: RouterContext,
) => {
  const todosList = await todos.find();
  ctx.response.body = todosList;
};

export const createTodo = async (
  ctx: RouterContext,
) => {
  const { title, description } = await ctx.request.body().value;
  const newTodo: Todo = {
    title,
    description,
    date: new Date(),
    done: false,
  };
  const id = await todos.insertOne(newTodo);
  newTodo._id = id;
  ctx.response.status = 201;
  ctx.response.body = newTodo;
};

export const deleteTodo = async (
  ctx: RouterContext,
) => {
  const todoId = ctx.params.id!;
  await todos.deleteOne({ _id: { $oid: todoId } });
  ctx.response.status = 204;
};

export const updateTodo = async (
  ctx: RouterContext,
) => {
  const todoId = ctx.params.id!;
  const { done } = await ctx.request.body().value;
  await todos.updateOne(
    { _id: { $oid: todoId } },
    { $set: { done } },
  );
  ctx.response.body = await todos.findOne({ _id: { $oid: todoId } });
};

在上面的代码中,我们导入了必要的模块和依赖项。然后,我们在 db.ts 文件中创建了一个名为 todos 的集合,用于存储我们的 Todo 数据。接着,我们定义了一个名为 getTodos 的函数,该函数用于检索所有 Todo 记录并将它们作为响应体返回。然后,我们定义了名为 createTododeleteTodoupdateTodo 的函数,这些函数负责相应的 CRUD 操作。

配置 Todo 路由

现在我们已经定义了 Todo 控制器,我们需要配置我们的路由,以使我们的 API 能够响应请求。下面的代码演示了如何创建一个名为 router.ts 的路由器并配置它的路由,以使我们的 API 能够支持我们的 CRUD 操作:

import { Router } from "https://deno.land/x/oak/mod.ts";
import { getTodos, createTodo, deleteTodo, updateTodo } from "./controllers/todos.ts";

const router = new Router();

router
  .get("/todos", getTodos)
  .post("/todos", createTodo)
  .delete("/todos/:id", deleteTodo)
  .put("/todos/:id", updateTodo);

export default router;

在上面的代码中,我们导入了必要的模块和依赖项。然后,我们创建了一个名为 router 的路由器,并配置了四个路由。这四个路由分别是 GET /todosPOST /todosDELETE /todos/:idPUT /todos/:id 请求,以进行相应的 CRUD 操作。

启动 Todo 应用程序

现在我们已经定义了 Todo 控制器和配置了 Todo 路由器,我们需要启动我们的应用程序以开始处理请求。下面的代码演示了如何创建应用程序实例并将其启动:

import { Application } from "https://deno.land/x/oak/mod.ts";
import router from "./router.ts";

const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());

app.addEventListener("listen", ({ secure, hostname, port }) => {
  console.log(`Listening on ${secure ? "https://" : "http://"}${hostname ??
    "127.0.0.1"}:${port}`);
});

await app.listen({ port: 8000 });

在上面的代码中,我们创建了一个名为 app 的应用程序实例,并将其配置为使用 router 路由器。然后,我们使用 addEventListener 方法添加一个事件监听器,该监听器在应用程序启动时输出应用程序的 URL。最后,我们使用 await app.listen 方法启动应用程序并将其监听在端口 8000 上。

测试 Todo RESTful API

现在我们已经完成了应用程序的编写和配置,我们可以使用一些简单的 HTTP 请求来测试我们的 Todo RESTful API。下面的代码演示了如何使用 curl 工具与我的本地主机上运行的 Todo 应用程序进行请求,并演示了每个 CRUD 操作的结果:

# Retrieve all todo records
curl http://localhost:8000/todos

# Response should be []
[{"_id":{"$oid":"606227f752aabdbcaa91b9a9"},"title":"Buy Groceries","description":"Buy milk, bread and eggs","date":{"$date":{"$numberLong":"1616981735829"}},"done":false}]

# Create a new todo record
curl -X POST -H "Content-Type: application/json" -d '{"title": "Wash Car", "description": "Wash my car at 8:00 AM"}' http://localhost:8000/todos

# Response should be {"_id":{"$oid":"60622a7b52aabdbcaa91b9aa"},"title":"Wash Car","description":"Wash my car at 8:00 AM","date":{"$date":{"$numberLong":"1616982329630"}},"done":false}

# Update an existing todo record
curl -X PUT -H "Content-Type: application/json" -d '{"done": true}' http://localhost:8000/todos/606227f752aabdbcaa91b9a9

# Response should be {"_id":{"$oid":"606227f752aabdbcaa91b9a9"},"title":"Buy Groceries","description":"Buy milk, bread and eggs","date":{"$date":{"$numberLong":"1616981735829"}},"done":true}

# Delete an existing todo record
curl -X DELETE http://localhost:8000/todos/606227f752aabdbcaa91b9a9

# Response should be an empty response with HTTP status code 204

总结

在本文中,我们学习了如何在 Deno 中使用 MongoDB 驱动程序来实现数据持久化。我们使用了一些基本的 MongoDB 操作来创建、检索、更新和删除文档,并实现了一个简单的 Todo RESTful API,以演示如何使用 Deno 和 MongoDB 驱动程序实现数据存储和管理。当然,这只是 Deno 中的 MongoDB 操作的冰山一角。有许多其他的 MongoDB 操作可以执行。因此,我建议您参阅 MongoDB 官方文档以获取更多信息。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a22028add4f0e0ffa2f16d


纠错反馈