在本系列的part one中,我们设置了开发环境和基本文件结构。现在,让我们设计API本身。在本文中,我们将介绍以下主题:
-
决定我们的API的路线和功能
-
定义数据库的数据模型
-
实施数据模型
-
设置数据库连接
让我们开始!
决定路线和功能
设计我们的API的第一步是决定要包括的路线和功能。
让我们概述我们博客的要求:
-
用户应该能够注册并登录博客应用
-
博客可以在两个状态下:草稿和发布
-
用户应该能够获取已发布文章的列表,无论是否登录
-
用户应该能够获取已发布的文章,无论是否登录
-
登录用户应该能够创建文章。
-
当创建文章时,应处于草稿状态。
-
本文的作者应能够将文章状态更新为已发布
-
本文的作者应能够在草案或已发布状态中编辑该文章
-
本文的作者应能够在草案或已发布状态中删除该文章
-
本文的作者应该能够获取其文章列表。端点应通过状态
进行分页和过滤。
-
创建的文章应具有标题,封面图像,描述,标签,作者,时间戳,状态,读取计数,阅读时间和身体。
-
登录和未登录的用户都可以访问的文章端点列表应分页。
- 应该通过作者,标题和标签搜索。
- 也应该通过阅读计数,阅读时间和时间戳 来订购。
-
当请求一篇文章时,API应通过博客返回作者的信息,博客的阅读计数应增加1。
考虑概述要求,我们将定义我们的路线如下:
-
博客路线:
- 获取 /博客:检索所有已发表文章的列表< /li>
- get/blog/:article_id:通过其ID检索一篇文章
-
作者路线:我们只希望身份验证的用户能够访问这些路线和所有CRUD操作。
- get/witer/blog:检索用户创建的所有已发表文章的列表。
- 帖子/作者/博客:创建新文章
- 补丁/作者/博客/编辑/:aprent_id:通过其ID更新文章
- 补丁/作者/博客/edit/state/:article_id:更新文章的状态 态
-
auth路由:用于管理用户身份验证。
- post/auth/cignup:注册新用户
- post/auth/login:登录现有用户
定义数据模型
通过定义的路线,我们可以开始考虑数据库的数据模型。数据模型是将存储在数据库中的数据以及该数据之间的关系的表示。我们将使用Mongoose定义我们的模式。
我们将有两个数据模型:博客和用户。
用户
字段 | data_type | 约束 |
---|---|---|
firstName | 字符串 | 必需 |
lastname | 字符串 | 必需 |
电子邮件 | 字符串 | 必需,唯一,索引 |
密码 | 字符串 | 必需 |
文章 | 数组,[Objectid] | 参考 - 博客 |
博客
字段 | data_type | 约束 |
---|---|---|
标题 | 字符串 | 必需,唯一,索引 |
描述 | 字符串 | |
标签 | 数组,[string] | |
imageurl | 字符串 | |
作者 | objectid | 参考 - 用户 |
时间戳 | date | |
状态 | 字符串 | 需要,枚举:['草稿','发布'],默认值:'草稿' |
readcount | 号码 | 默认值:0 |
ReadingTime | 字符串 | |
身体 | 字符串 | 必需 |
Mongoose具有一种称为populate()
的方法,它使您可以在其他集合中引用文档。 populate()
将用其他集合中的文档自动替换文档中指定的路径。 User
型号的articles
字段设置为一系列ObjectId
。 ref
选项是告诉Mongoose在人口期间使用哪种模型,在这种情况下为Blog
模型。我们在这里存储的所有_id
都必须是Blog
型号的文章_id
。同样,Blog
模型引用了其author
字段中的User
模型。
实施数据模型
- 在
/src/models
中,创建一个名为blog.model.js
的文件,并设置博客模型:
const mongoose = require("mongoose");
const uniqueValidator = require('mongoose-unique-validator');
const { Schema } = mongoose;
const BlogSchema = new Schema({
title: { type: String, required: true, unique: true, index: true },
description: String,
tags: [String],
author: { type: Schema.Types.ObjectId, ref: "Users" },
timestamp: Date,
imageUrl: String,
state: { type: String, enum: ["draft", "published"], default: "draft" },
readCount: { type: Number, default: 0 },
readingTime: String,
body: { type: String, required: true },
});
// Apply the uniqueValidator plugin to the blog model
BlogSchema.plugin(uniqueValidator);
const Blog = mongoose.model("Blog", BlogSchema);
module.exports = Blog;
title
字段定义为所需的字符串,并且必须在集合中的所有文档中唯一。 description
字段定义为字符串,而tags
字段定义为字符串数组。 author
字段定义为对users
集合中的文档的引用,而timestamp
字段定义为日期。 imageUrl
字段定义为字符串,state
字段定义为具有一组允许值的字符串(“草稿”或“已发布”),并且readCount
字段定义为默认值为0的数字。 readingTime
字段定义为字符串,body
字段定义为必需的字符串。
mongoose-unique-validator
是一个插件,可为杂种架构中的唯一字段添加预循环验证。如果集合中已经存在唯一字段的值,它将在模式中验证架构中的unique
选项,并防止文档的插入。
- 在
/src/models
中,创建一个名为user.model.js
的文件,并设置用户模型:
const mongoose = require("mongoose");
const uniqueValidator = require("mongoose-unique-validator");
const bcrypt = require("bcrypt");
const { Schema } = mongoose;
const UserModel = new Schema({
firstname: { type: String, required: true },
lastname: { type: String, required: true },
email: {
type: String,
required: true,
unique: true,
index: true,
},
password: { type: String, required: true },
articles: [{ type: Schema.Types.ObjectId, ref: "Blog" }],
});
// Apply the uniqueValidator plugin to the user model
UserModel.plugin(uniqueValidator);
UserModel.pre("save", async function (next) {
const user = this;
if (user.isModified("password") || user.isNew) {
const hash = await bcrypt.hash(this.password, 10);
this.password = hash;
} else {
return next();
}
});
const User = mongoose.model("Users", UserModel);
module.exports = User;
将firstname
和lastname
字段定义为必需的字符串,而email
字段定义为必需的字符串,并且在集合中的所有文档中都必须是唯一的。 password
字段定义为必需的字符串,而articles
字段定义为对Blog
集合中文档的引用数组。
pre
挂钩用于添加在运行特定的猫鼬方法之前将执行的函数。在此处的前挂钩挂钩使用NPM模块bcrypt
han用户的密码,然后将用户文档保存到数据库。
设置数据库连接
现在我们已经定义了路线和数据模型,现在该设置数据库连接了。
-
设置您的mongoDB数据库,然后将连接URL保存在
.env
文件中。 -
运行以下命令以安装NPM软件包
mongoose
:
npm install --save mongoose
- 在
/database
目录中创建一个名为db.js
的文件。在/database/db.js
中,使用Mongoose设置数据库连接:
const mongoose = require('mongoose');
const connect = (url) => {
mongoose.connect(url || 'mongodb://[localhost:27017](http://localhost:27017)')
mongoose.connection.on("connected", () => {
console.log("Connected to MongoDB Successfully");
});
mongoose.connection.on("error", (err) => {
console.log("An error occurred while connecting to MongoDB");
console.log(err);
});
}
module.exports = { connect };
connect
函数采用可选的url
参数,该参数指定要连接到的数据库的URL。如果没有提供URL,则默认为“ mongodb:// localhost:27017”,该'连接到默认端口的本地计算机上运行的mongoDB实例(27017)。
- 在
/database
目录中创建一个index.js
文件:
const database = require("./db");
module.exports = {
database,
};
现在,我们已经设置了数据库连接,在下一篇文章中,我们将研究两个重要的概念 - 身份验证和数据验证。敬请期待!