介绍
Mongoose是用于为 Node.js 和 MongoDB 后端操作数据的基本工具之一。
在本文中,您将研究将 Mongoose 与MongoDB Atlas远程数据库结合使用。本教程中的示例将由食物列表及其热量值组成。用户将能够创建新项目、阅读项目、更新项目和删除项目。
先决条件
- 熟悉使用 Express 作为服务器。您可以咨询这篇文章的快递和官方Express文档。
- 熟悉在没有任何身份验证的情况下设置 REST API。您可以咨询与快速路由这篇文章和这篇文章
async
和await
。
建议下载并安装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
接下来,安装express
和mongoose
:
- npm install express@4.17.1 mongoose@5.11.12
此时,您将拥有一个带有express
和的新项目mongoose
。
第 2 步 – 设置服务器
在本节中,您将创建一个新文件来运行 Express 服务器、连接到 MongoDB Atlas 数据库并导入未来的路由。
创建一个新server.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()
将采用连接字符串和配置选项的对象。在本教程中,目的useNewUrlParser
,useFindAndModify
以及useUnifiedTopology
配置设置是必要的,以避免产生警告。
此时,您已经启动了 Express 服务器。接下来您需要定义架构并处理路由。
第 3 步 – 构建架构
首先,您需要有一个模式来构建您的数据,这些模式被称为模式。模式允许您确切地决定您想要什么数据以及您希望数据作为对象具有哪些选项。
在本教程中,您将使用该mongoose.model
方法使其可用于实际数据,并将其导出为可在foodRoutes.js
.
创建一个新models
目录:
- mkdir 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
它将是required
,trim
任何空格,并设置为lowercase
字符。它还将包含一个calories
类型为 的值Number
,它default
的值为 0,并validate
确保没有提交负数。
第 4 步 – 构建读取路由
设置好数据模型后,您就可以开始设置路由来使用它了。这将利用Mongoose 提供的各种查询功能。
您将首先阅读数据库中的所有食物。此时,它将是一个空数组。
创建一个新routes
目录:
- mkdir 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
:
// ...
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
.
在正文部分,选择raw和JSON。然后,通过构造一个带有name
and的 JSON 对象来添加一个新的食物项目calories
:
{
"name": "cotton candy",
"calories": 100
}
发送Create New Food请求后,再次发送Read All Food请求。Postman 结果将显示新添加的对象。
第 6 步 – 构建更新路由
使用 Mongoose 创建的每个对象都有自己的对象_id
,您可以使用它来定位特定项目。它将是字母字符和字母的混合。例如:5d1f6c3e4b0b88fb1d257237
。
接下来,您将构建更新现有食品项目并将更改保存到数据库的功能。
重新访问该foodRoutes.js
文件并在app.post
和之间添加以下代码行module.exports
:
// ...
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
是您之前创建的食物的标识字符串。
在正文部分,选择raw和JSON。然后,通过构造一个带有name
and的 JSON 对象来修改您的食物项目calories
:
{
"calories": "999"
}
发送更新食物请求后,再次发送读取所有食物请求。Postman 结果将显示修改后的对象calories
。
第 7 步 – 构建删除路由
最后,您将构建删除现有食品并将更改保存到数据库的功能。
重新访问该foodRoutes.js
文件并在app.patch
和之间添加以下代码行module.exports
:
// ...
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 主题页面以获取练习和编程项目。