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

简介: 笔记

可重用 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,将在页面上看到一个空数组。

1.png

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

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

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

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

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

相关文章
|
11月前
|
安全 Java API
使用 Java 构建强大的 REST API 的四个基本技巧
本文结合探险领域案例,分享Java构建REST API的四大核心策略:统一资源命名、版本控制与自动化文档、安全防护及标准化异常处理,助力开发者打造易用、可维护、安全可靠的稳健API服务。
591 116
|
10月前
|
人工智能 API 开发工具
构建AI智能体:一、初识AI大模型与API调用
本文介绍大模型基础知识及API调用方法,涵盖阿里云百炼平台密钥申请、DashScope SDK使用、Python调用示例(如文本情感分析、图像文字识别),助力开发者快速上手大模型应用开发。
3246 18
构建AI智能体:一、初识AI大模型与API调用
|
12月前
|
运维 NoSQL Serverless
《第四纪元》玩得轻松,构建也轻松 | 阿里云云原生 API 网关、函数计算助力 IGame 快速构建轻休闲游戏
在轻休闲游戏流量波动大、生命周期短的背景下,传统架构难以应对成本与扩展挑战。本文介绍了基于阿里云函数计算 FC 和 Redis 构建的新一代服务器架构,实现弹性伸缩、成本优化与高效运维,助力轻休闲游戏快速迭代与稳定运营,提升开发效率并降低运维复杂度。
《第四纪元》玩得轻松,构建也轻松 | 阿里云云原生 API 网关、函数计算助力 IGame 快速构建轻休闲游戏
|
11月前
|
监控 安全 API
构建坚不可摧的防线:全方位保障API接口数据安全
在数字化时代,API作为系统间数据沟通的桥梁,其安全性至关重要。本文系统解析API安全的四大基石:身份认证、授权管理、数据完整性与机密性,并深入探讨HTTPS加密、强认证机制、精细授权、数据保护及纵深防御等关键技术实践,帮助企业构建全面的API安全体系,防范数据泄露与攻击风险,保障数据传输安全与业务稳定运行。
|
NoSQL MongoDB 数据库
数据库数据恢复—MongoDB数据库数据恢复案例
MongoDB数据库数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 工作人员在MongoDB服务仍然开启的情况下将MongoDB数据库文件拷贝到其他分区,数据复制完成后将MongoDB数据库原先所在的分区进行了格式化操作。 结果发现拷贝过去的数据无法使用。管理员又将数据拷贝回原始分区,MongoDB服务仍然无法使用,报错“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
|
缓存 NoSQL Linux
在CentOS 7系统中彻底移除MongoDB数据库的步骤
以上步骤完成后,MongoDB应该会从您的CentOS 7系统中被彻底移除。在执行上述操作前,请确保已经备份好所有重要数据以防丢失。这些步骤操作需要一些基本的Linux系统管理知识,若您对某一步骤不是非常清楚,请先进行必要的学习或咨询专业人士。在执行系统级操作时,推荐在实施前创建系统快照或备份,以便在出现问题时能够恢复到原先的状态。
1300 79
|
存储 NoSQL MongoDB
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
456 8
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
|
12月前
|
运维 NoSQL 容灾
告别运维噩梦:手把手教你将自建 MongoDB 平滑迁移至云数据库
程序员为何逃离自建MongoDB?扩容困难、运维复杂、高可用性差成痛点。阿里云MongoDB提供分钟级扩容、自动诊断与高可用保障,助力企业高效运维、降本增效,实现数据库“无感运维”。
|
NoSQL MongoDB 数据库
数据库数据恢复——MongoDB数据库服务无法启动的数据恢复案例
MongoDB数据库数据恢复环境: 一台Windows Server操作系统虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 管理员在未关闭MongoDB服务的情况下拷贝数据库文件。将MongoDB数据库文件拷贝到其他分区后,对MongoDB数据库所在原分区进行了格式化操作。格式化完成后将数据库文件拷回原分区,并重新启动MongoDB服务。发现服务无法启动并报错。
|
存储 NoSQL MongoDB
数据库数据恢复—MongoDB数据库迁移过程中丢失文件的数据恢复案例
某单位一台MongoDB数据库由于业务需求进行了数据迁移,数据库迁移后提示:“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”