如何使用 Mongoose 和 MongoDB Atlas 执行 CRUD 操作

介绍

Mongoose是用于为 Node.js 和 MongoDB 后端操作数据的基本工具之一。

在本文中,您将研究将 Mongoose 与MongoDB Atlas远程数据库结合使用。本教程中的示例将由食物列表及其热量值组成。用户将能够创建新项目、阅读项目、更新项目和删除项目。

先决条件

建议下载并安装Postman 之类的工具来测试 API 端点。

本教程已通过 Node v15.3.0、npmv7.4.0、expressv4.17.1、mongoosev5.11.12 和 MongoDB v4.2 验证。

MongoDB Atlas 设置

该项目还需要一个MongoDB Atlas帐户。

创建帐户并登录后,请按照以下步骤部署免费层集群

一旦您设置了集群、数据库用户和 IP 地址,您就可以为以后在设置项目的其余部分时获取连接字符串做好准备。

步骤 1 — 设置项目

在本节中,您将为您的项目创建一个目录并安装依赖项。

为您的项目创建一个新目录:

  • mkdir mongoose-mongodb-atlas-example

导航到新创建的目录:

  • cd mongoose-mongodb-atlas-example

此时,您可以初始化一个新的 npm 项目:

  • npm init -y

接下来,安装expressmongoose

  • npm install express@4.17.1 mongoose@5.11.12

此时,您将拥有一个带有express的新项目mongoose

第 2 步 – 设置服务器

在本节中,您将创建一个新文件来运行 Express 服务器、连接到 MongoDB Atlas 数据库并导入未来的路由。

创建一个新server.js文件并添加以下代码行:

服务器.js
const express = require("express");
const mongoose = require("mongoose");
const foodRouter = require("./routes/foodRoutes.js");

const app = express();

app.use(express.json());

mongoose.connect(
  "mongodb+srv://madmin:<password>@clustername.mongodb.net/<dbname>?retryWrites=true&w=majority",
  {
    useNewUrlParser: true,
    useFindAndModify: false,
    useUnifiedTopology: true
  }
);

app.use(foodRouter);

app.listen(3000, () => {
  console.log("Server is running...");
});

注意连接字符串。这是 MongoDB Atlas 提供的连接字符串。您需要将管理员帐户 ( madmin)、密码、集群名称 ( clustername) 和数据库名称 ( dbname) 替换为与您的集群相关的值:

mongodb+srv://madmin:<password>@clustername.mongodb.net/<dbname>?retryWrites=true&w=majority

mongoose.connect()将采用连接字符串和配置选项的对象。在本教程中,目的useNewUrlParseruseFindAndModify以及useUnifiedTopology配置设置是必要的,以避免产生警告

此时,您已经启动了 Express 服务器。接下来您需要定义架构并处理路由。

第 3 步 – 构建架构

首先,您需要有一个模式来构建您的数据,这些模式被称为模式。模式允许您确切地决定您想要什么数据以及您希望数据作为对象具有哪些选项。

在本教程中,您将使用该mongoose.model方法使其可用于实际数据,并将其导出为可在foodRoutes.js.

创建一个新models目录:

  • mkdir models

在这个新目录中,创建一个新food.js文件并添加以下代码行:

./models/food.js
const mongoose = require("mongoose");

const FoodSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    trim: true,
    lowercase: true,
  },
  calories: {
    type: Number,
    default: 0,
    validate(value) {
      if (value < 0) throw new Error("Negative calories aren't real.");
    },
  },
});

const Food = mongoose.model("Food", FoodSchema);

module.exports = Food;

此代码定义了您的FoodSchema. 它将包含一个name类型为 的值,String它将是requiredtrim任何空格,并设置为lowercase字符。它还将包含一个calories类型为 的Number,它default的值为 0,并validate确保没有提交负数。

第 4 步 – 构建读取路由

设置好数据模型后,您就可以开始设置路由来使用它了。这将利用Mongoose 提供的各种查询功能

您将首先阅读数据库中的所有食物。此时,它将是一个空数组。

创建一个新routes目录:

  • mkdir routes

在这个新目录中,创建一个新foodRoutes.js文件并添加以下代码行:

./routes/foodRoutes.js
const express = require("express");
const foodModel = require("../models/food");
const app = express();

app.get("/foods", async (request, response) => {
  const foods = await foodModel.find({});

  try {
    response.send(foods);
  } catch (error) {
    response.status(500).send(error);
  }
});

module.exports = app;

此代码/foods为 GET 请求建立一个端点(注意复数“s”)。Mongoose 查询函数find()返回具有匹配参数的所有对象。由于没有提供参数,它将返回数据库中的所有项目。

由于 Mongoose 函数是异步的,因此您将使用async/await. 获得数据后,此代码使用一个try/catch块来发送它。这对于使用 Postman 验证数据很有用。

导航到项目目录的根目录并在终端中使用以下命令运行 Express 服务器:

  • node server.js

在 Postman 中,创建一个新的Read All Food请求。确保请求类型设置为GET请求 URL设置localhost:3000/foods. 然后点击发送

注意:如果您需要在 Postman 界面导航以获取请求方面的帮助,请参阅官方文档

Postman 结果将显示一个空数组。

第 5 步 – 构建创建路由

接下来,您将构建创建新食品并将其保存到数据库的功能。

重新访问该foodRoutes.js文件并在app.get之间添加以下代码行module.exports

./routes/foodRoutes.js
// ...

app.post("/food", async (request, response) => {
  const food = new foodModel(request.body);

  try {
    await food.save();
    response.send(food);
  } catch (error) {
    response.status(500).send(error);
  }
});

// ...

此代码/food为 POST 请求建立一个端点。Mongoose 查询函数.save()用于将传递给它的数据保存到数据库中。

在 Postman 中,创建一个名为Create New Food的新请求确保请求类型设置为POST请求 URL设置localhost:3000/food.

正文部分,选择rawJSON然后,通过构造一个带有nameand的 JSON 对象来添加一个新的食物项目calories

{
  "name": "cotton candy",
  "calories": 100
}

发送Create New Food请求后,再次发送Read All Food请求。Postman 结果将显示新添加的对象。

第 6 步 – 构建更新路由

使用 Mongoose 创建的每个对象都有自己的对象_id,您可以使用它来定位特定项目。它将是字母字符和字母的混合。例如:5d1f6c3e4b0b88fb1d257237

接下来,您将构建更新现有食品项目并将更改保存到数据库的功能。

重新访问该foodRoutes.js文件并在app.post之间添加以下代码行module.exports

./routes/foodRoutes.js
// ...

app.patch("/food/:id", async (request, response) => {
  try {
    await foodModel.findByIdAndUpdate(request.params.id, request.body);
    await foodModel.save();
    response.send(food);
  } catch (error) {
    response.status(500).send(error);
  }
});

// ...

此代码/food/:id为 PATCH 请求建立一个端点。Mongoose 查询函数.findByIdAndUpdate()采用目标id和您想要替换的请求数据。然后,.save()用于保存更改。

在 Postman 中,创建一个名为Update Food的新请求确保请求类型设置为PATCH请求 URL设置localhost:3000/food/<id>,其中id是您之前创建的食物的标识字符串。

正文部分,选择rawJSON然后,通过构造一个带有nameand的 JSON 对象来修改您的食物项目calories

{
  "calories": "999"
}

发送更新食物请求后,再次发送读取所有食物请求。Postman 结果将显示修改后的对象calories

第 7 步 – 构建删除路由

最后,您将构建删除现有食品并将更改保存到数据库的功能。

重新访问该foodRoutes.js文件并在app.patch之间添加以下代码行module.exports

./routes/foodRoutes.js
// ...

app.delete("/food/:id", async (request, response) => {
  try {
    const food = await foodModel.findByIdAndDelete(request.params.id);

    if (!food) response.status(404).send("No item found");
    response.status(200).send();
  } catch (error) {
    response.status(500).send(error);
  }
});

// ...

此代码/food/:id为 DELETE 请求建立端点。Mongoose 查询函数.findByIdAndDelete()获取目标id并将其删除。

在 Postman 中,创建一个名为Delete Food的新请求确保请求类型设置为DELETE请求 URL设置localhost:3000/food/<id>,其中id是您之前创建的食物的标识字符串。

发送删除食物请求后,再次发送读取所有食物请求。Postman 结果将显示一个没有删除项目的数组。

注意:现在您已经完成了本教程,您可能希望终止您不再使用的任何 MongoDB Atlas 集群。

此时,您有一个使用 Mongoose 方法与 MongoDB Atlas 集群交互的 Express 服务器。

结论

在本文中,您学习了如何使用 Mongoose 方法快速制作和管理后端数据。

如果您想了解有关 Node.js 的更多信息,请查看我们的 Node.js 主题页面以获取练习和编程项目。

如果您想了解有关 MongoDB 的更多信息,请查看我们的 MongoDB 主题页面以获取练习和编程项目。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁