如何使用Mongoose和MongoDBAtlas执行CRUD操作

来自菜鸟教程
跳转至:导航、​搜索

介绍

Mongoose 是为 Node.js 和 MongoDB 后端处理数据的基本工具之一。

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

先决条件

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

本教程已使用 Node v15.3.0、npm v7.4.0、express v4.17.1、mongoose v5.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

此时,您将拥有一个包含 expressmongoose 的新项目。

第 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() 将采用连接字符串和配置选项的对象。 就本教程而言,useNewUrlParseruseFindAndModifyuseUnifiedTopology 配置设置对于 避免弃用警告 是必需的。

此时,您已经启动了 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 任何空格,并设置为 [X127X ] 人物。 它还将包含一个类型为 Numbercalories 值,它的 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;

此代码为 GET 请求建立了一个 /foods 端点(注意复数“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.getmodule.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);
  }
});

// ...

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

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

Body 部分中,选择 rawJSON。 然后,通过使用 namecalories 构造一个 JSON 对象来添加一个新的食物项:

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

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

第 6 步 - 构建更新路线

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

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

重新访问 foodRoutes.js 文件并在 app.postmodule.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);
  }
});

// ...

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

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

Body 部分中,选择 rawJSON。 然后,通过使用 namecalories 构造一个 JSON 对象来修改您的食物项目:

{
  "calories": "999"
}

发送 Update Food 请求后,再次发送 Read All Food 请求。 Postman 结果将显示修改后的 calories 的对象。

第 7 步 - 构建删除路线

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

重新访问 foodRoutes.js 文件并在 app.patchmodule.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);
  }
});

// ...

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

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

发送Delete Food请求后,再次发送Read All Food请求。 Postman 结果将显示一个不包含已删除项目的数组。

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


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

结论

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

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

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