likes
comments
collection
share

Nodejs、GraphQL、MongoDB、Hapi 和 Swagger 构建 API(三)

作者站长头像
站长
· 阅读数 39

可重用 API 流行的最大原因是 API 允许使用来自 Web 客户端、移动应用程序、桌面应用程序的数据,实际上是任何客户端。将构建一个基于 Nodejs,由 MongoDB 数据驱动的强大而灵活的 GraphQL API,并支持 Swagger 文档。

本文基于《Nodejs、GraphQL、MongoDB、Hapi 和 Swagger 构建 API(一)》的MongoDB数据库部分。

项目代码仓库:github.com/QuintionTan…

创建 Models

在开始创建数据模型之前,先把上面连接数据库的代码稍微整理一下,将其封装到一个文件中,创建文件名 mongoConns.js,代码如下:

const mongoose = require("mongoose");

class MongoConns {
    constructor() {
        this.getMainDB = this.getMainDB.bind(this);
        const mongoUrl = "mongodb://127.0.0.1:27018/powerful";
        this.mainDB = mongoose.createConnection(mongoUrl, {
            useNewUrlParser: true,
            useCreateIndex: true,
            useUnifiedTopology: true,
        });
        this.mainDB
            .then((db) => {
                console.info("Connected to MongoDB mainDB");
            })
            .catch((err) => {
                console.error("Failed to connect to mainDB", {
                    params: { err: err.message },
                });
            });
    }

    getMainDB() {
        return this.mainDB;
    }
}

let mongoConns = null;
module.exports = () => {
    if (mongoConns) return mongoConns;
    else {
        mongoConns = new MongoConns();
        return mongoConns;
    }
};

对于 MongoDB,遵循模型约定,接下来进行数据建模。这是一个相对简单的概念,将能够掌握。基本上,只是为集合声明对应的模式。可以将 MongoDB 的集合视为 SQL 数据库中的表。

在项目根目录下创建文件夹 models,在文件夹 models 中创建数据模型文件 Painting.js,代码如下:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const mongoConns = require("../mongoConns")();

const PaintingSchema = new Schema({
    name: {
        type: String,
    },
    url: {
        type: String,
    },
    techniques: {
        type: [String],
    },
});

module.exports = mongoConns.getMainDB().model("Painting", PaintingSchema);
  • 需要 mongoose 依赖
  • 引入数据库连接并初始化 mongoConns
  • 通过调用 mongoose 架构构造函数并传入选项来声明 PaintingSchema。注意它是如何强类型化的:例如,定义了 name 字段可以由一个字符串组成,而 techniques 由一个字符串数组组成。
  • 导出模型并将其命名为 Painting

增加新的路由

理想情况下,希望 URL 端点反映相应的操作。例如 /api/v1/paintings 或者 /api/v1/paintings/{id} 等等。

GETPOST 路由开始。 GET 获取所有 Painting ,POST 添加新的 Painting

回到根目录文件 server.js,添加两个新的路由代码:

const API_ENDPOINT = "/api/v1";
const init = async () => {
    server.route(
        {
            method: "GET",
            path: "/",
            handler: (request, response) => `<h1>This is powerful api.</h1>`,
        },
        {
            method: "GET",
            path: `${API_ENDPOINT}/paintings`,
            handler: (req, reply) => {
                return Painting.find();
            },
        },
        {
            method: "POST",
            path: `${API_ENDPOINT}/paintings`,
            handler: (req, reply) => {
                const { name, url, techniques } = req.payload;
                const painting = new Painting({
                    name,
                    url,
                    techniques,
                });
                return painting.save();
            },
        }
    );

    await server.start();
    console.log(`Server running at:${server.info.uri}`);
};

请注意,将路由修改为对象数组而不是单个对象,还使用了箭头函数。

  • /api/v1/paintings 路径创建了一个 GET 路由。在处理程序中,mongoose schema 方法 find(),它将返回所有记录,因为这里没有没有传递任何条件来查找。
  • 还为 /api/v1/paintings 路径创建了一个 POST 路由。这样的API设计将遵循 REST 约定。

在浏览器中输入 http://localhost:3006/api/v1/paintings,将在页面上看到一个空数组。

Nodejs、GraphQL、MongoDB、Hapi 和 Swagger 构建 API(三)

接下来调试 POST 的接口,需要按照工具 Postmain,下载安装好。

Nodejs、GraphQL、MongoDB、Hapi 和 Swagger 构建 API(三)

打开 Postmain ,创建一个POST 请求。

Nodejs、GraphQL、MongoDB、Hapi 和 Swagger 构建 API(三)

配置好参数,点击发送,看到响应如下:

Nodejs、GraphQL、MongoDB、Hapi 和 Swagger 构建 API(三)

至此一个新的记录已经创建了,可以去数据库中查看。或者返回浏览器刷新 http://localhost:3006/api/v1/paintings,可以看到如下数据:

Nodejs、GraphQL、MongoDB、Hapi 和 Swagger 构建 API(三)

至此一个读取、写入接口完成了。

转载自:https://juejin.cn/post/7180708274302353465
评论
请登录