在 Node.js 中使用 Yaml 编写API文档

简介: 在文章《使用Node.js、MongoDB、Fastify 构建API服务》中介绍使用 Swagger 构建 API 文档,编写文档不是那么的顺手,本文介绍另一种编写 API 文档的方式,即使用 Yaml ,将API文档与其实现完全分开。

在文章《使用Node.js、MongoDB、Fastify 构建API服务》中介绍使用 Swagger 构建 API 文档,编写文档不是那么的顺手,本文介绍另一种编写 API 文档的方式,即使用 Yaml ,将API文档与其实现完全分开。

文章将继续在项目 restful-api 基础上进行迭代,首先先来简单了解一下 Yaml。

什么是 Yaml

YAML 是一种常用于数据序列化的文件格式,有很多项目使用 YAML 文件进行配置,常见的有 docker-composeESLintKubernetes 等等。最初代表 Yet Another Markup Language ,后来改为 YAML Ain't Markup Language ,以区别于真正的标记语言。

它类似于 XML 和 JSON 文件,但使用更简约的语法,即使在保持类似功能的同时也是如此。YAML 是 JSON 的超集(来源),每个有效的 JSON 文件也是一个有效的 YAML 文件。前面 Swagger 文档就是需要构建一个 JSON 数据,正好利用 YAML 的这个特性。

YAML 文件使用类似于 Python 的缩进系统来显示程序的结构,需要使用空格而不是制表符来创建缩进以避免混淆。

编写 Yaml

在项目目录 src/docs 中创建文件 api.yaml,添加以下代码:

openapi: 3.0.1
info:
    description: 这是一个关于咖啡种类的 API。
    title: Coffee Restful API
    version: 1.0.0
servers:
    - description: Main server
      url: http://localhost:8100/api/v1
paths:
    /coffees:
        get:
            operationId: coffeesGET
            responses:
                "200":
                    content:
                        application/json:
                            schema:
                                items:
                                    $ref: "#/components/schemas/Coffee"
                                type: array
                                x-content-type: application/json
                    description: 获取成功
            description: 获取咖啡种类列表
            summary: 获取所有的咖啡种类列表
            tags:
                - Coffees
        post:
            operationId: coffeesPOST
            requestBody:
                content:
                    application/json:
                        schema:
                            $ref: "#/components/schemas/CoffeeRequest"
            responses:
                "200":
                    content:
                        application/json:
                            schema:
                                items:
                                    $ref: "#/components/schemas/Coffee"
                                type: array
                                x-content-type: application/json
                    description: 创建成功
            description: 增加新的咖啡种类
            summary: 创建新的咖啡种类
            tags:
                - Coffees
    /coffees/{id}:
        get:
            operationId: coffeesIdGET
            parameters:
                - description: 咖啡种类id
                  explode: false
                  in: path
                  name: id
                  required: true
                  schema:
                      type: string
                  style: simple
            responses:
                "200":
                    content:
                        application/json:
                            schema:
                                $ref: "#/components/schemas/Coffee"
                    description: 获取详情成功
            description: 通过id获取咖啡种类详情
            summary: 获取咖啡种类详情
            tags:
                - Coffees
        delete:
            operationId: coffeesIdDELETE
            parameters:
                - description: 咖啡种类id
                  explode: false
                  in: path
                  name: id
                  required: true
                  schema:
                      type: string
                  style: simple
            responses:
                "204":
                    description: 删除成功
            description: 通过id删除咖啡种类详情
            summary: 删除咖啡种类详情
            tags:
                - Coffees
        put:
            operationId: coffeesIdPUT
            parameters:
                - description: 咖啡种类id
                  explode: false
                  in: path
                  name: id
                  required: true
                  schema:
                      type: string
                  style: simple
            requestBody:
                content:
                    application/json:
                        schema:
                            $ref: "#/components/schemas/CoffeeRequest"
            responses:
                "201":
                    content:
                        application/json:
                            schema:
                                $ref: "#/components/schemas/Coffee"
                    description: 更新成功
            description: 通过id 更新咖啡种类详情
            summary: 更新咖啡种类详情
            tags:
                - Coffees
components:
    schemas:
        Coffee:
            example:
                _id: id
                title: title
                ratio: ratio
                cup: cup
                description: description
            properties:
                _id:
                    maxLength: 24
                    minLength: 24
                    type: string
                title:
                    type: string
                ratio:
                    type: string
                cup:
                    type: string
                description:
                    type: string
            type: object
        CoffeeRequest:
            example:
                title: "Red Eye"
                ratio: "1 shot of espresso"
                cup: "8 oz. Coffee Mug"
                description: description
            properties:
                title:
                    type: string
                ratio:
                    type: string
                cup:
                    type: string
                description:
                    type: string
            type: object

修改配置 src/config/swagger.js ,完整代码如下:

exports.options = {
    routePrefix: "/api/v1/helper",
    exposeRoute: true,
    yaml: true,
    mode: "static",
};

去掉路由中与文档相关的信息,修改文件 src/routes/index.js,完整代码如下:

const coffeeController = require("../controllers/coffeeController");
const APIPATH = "/api/";
const VERSION = "v1";
const ENDPOINT = "/coffees";
const getFullPath = (method = "") => `${APIPATH}${VERSION}${ENDPOINT}${method}`;
const routes = [
    {
        method: "GET",
        url: getFullPath(),
        handler: coffeeController.getList,
    },
    {
        method: "GET",
        url: getFullPath("/:id"),
        handler: coffeeController.get,
    },
    {
        method: "POST",
        url: getFullPath(),
        handler: coffeeController.add,
    },
    {
        method: "PUT",
        url: getFullPath("/:id"),
        handler: coffeeController.update,
    },
    {
        method: "DELETE",
        url: getFullPath("/:id"),
        handler: coffeeController.delete,
    },
];
module.exports = routes;

修改入口文件 src/index.js,主要是修改 swagger 的部分,如下:

fastify.register(require("fastify-swagger"), {
    ...swagger.options,
    specification: {
        path: path.join(__dirname, "./docs", "api.yaml"),
        postProcessor: function (swaggerObject) {
            return swaggerObject;
        },
    },
});

运行后打开 API  文档路径,可以看到下面效果:

image.png



相关文章
|
2月前
|
人工智能 安全 架构师
告别旅行规划的"需求文档地狱"!这个AI提示词库,让你像调API一样定制完美旅程
作为开发者,旅行规划如同“需求地狱”:信息碎片、需求多变、缺乏测试。本文提出一套“企业级”AI提示词库,将模糊需求转化为结构化“API请求”,实现标准化输入输出,让AI成为你的专属旅行架构师,30分钟生成专业定制方案,提升决策质量,降低90%时间成本。
504 129
|
1月前
|
JSON API 数据格式
小红书API接口文档:笔记详情数据开发手册
小红书笔记详情API可获取指定笔记的标题、正文、互动数据及多媒体资源,支持字段筛选与评论加载。通过note_id和access_token发起GET/POST请求,配合签名验证,广泛用于内容分析与营销优化。
|
7月前
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
8月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
9月前
|
SQL 人工智能 关系型数据库
Flink CDC YAML:面向数据集成的 API 设计
本文整理自阿里云智能集团 Flink PMC Member & Committer 徐榜江(雪尽)在 FFA 2024 分论坛的分享,涵盖四大主题:Flink CDC、YAML API、Transform + AI 和 Community。文章详细介绍了 Flink CDC 的发展历程及其优势,特别是 YAML API 的设计与实现,以及如何通过 Transform 和 AI 模型集成提升数据处理能力。最后,分享了社区动态和未来规划,欢迎更多开发者加入开源社区,共同推动 Flink CDC 的发展。
712 12
Flink CDC YAML:面向数据集成的 API 设计
|
JavaScript 前端开发 API
Vue.js 3:探索组合式API带来的新变革
Vue.js 3:探索组合式API带来的新变革
375 84
|
8月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
SQL 人工智能 关系型数据库
Flink CDC YAML:面向数据集成的 API 设计
Flink CDC YAML:面向数据集成的 API 设计
354 5
|
JSON 缓存 JavaScript
深入浅出:使用Node.js构建RESTful API
在这个数字时代,API已成为软件开发的基石之一。本文旨在引导初学者通过Node.js和Express框架快速搭建一个功能完备的RESTful API。我们将从零开始,逐步深入,不仅涉及代码编写,还包括设计原则、最佳实践及调试技巧。无论你是初探后端开发,还是希望扩展你的技术栈,这篇文章都将是你的理想指南。
|
10月前
|
JavaScript 前端开发 安全
盘点原生JS中目前最没用的几个功能API
在JavaScript的发展历程中,许多功能与API曾风光无限,但随着技术进步和语言演化,部分功能逐渐被淘汰或被更高效的替代方案取代。例如,`with`语句使代码作用域复杂、可读性差;`void`操作符功能冗余且影响可读性;`eval`函数存在严重安全风险和性能问题;`unescape`和`escape`函数已被`decodeURIComponent`和`encodeURIComponent`取代;`arguments`对象则被ES6的剩余参数语法替代。这些变化体现了JavaScript不断优化的趋势,开发者应紧跟技术步伐,学习新技能,适应新技术环境。
195 10