使用node.js构建博客API:设计API(第2部分)
#node #api #mongodb #mongoose

在本系列的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字段设置为一系列ObjectIdref选项是告诉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;

firstnamelastname字段定义为必需的字符串,而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,
};

现在,我们已经设置了数据库连接,在下一篇文章中,我们将研究两个重要的概念 - 身份验证和数据验证。敬请期待!