在 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



相关文章
|
18天前
|
敏捷开发 测试技术 API
云效产品使用常见问题之代码仓库不支持API文档如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
2月前
|
数据可视化 Linux API
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
|
3月前
|
分布式计算 API Linux
通义千问API:找出两篇文章的不同
本章我们将介绍如何利用大模型开发一个文档比对小工具,我们将用这个工具来给互联网上两篇内容相近但版本不同的文档找找茬,并且我们提供了一种批处理文档比对的方案
|
3月前
|
Web App开发 JavaScript NoSQL
深入浅出:构建基于Node.js的RESTful API
在当今快速发展的互联网时代,RESTful API已成为前后端分离架构中不可或缺的一部分。本文旨在为初学者和中级开发人员提供一个清晰、简洁的指南,详细介绍如何使用Node.js构建一个高效、可维护的RESTful API。通过结合实际案例,本文将从API设计理念出发,深入讲解如何利用Express框架及MongoDB数据库实现API的增删改查功能,同时探讨如何通过JWT进行安全认证,确保数据传输的安全性。此外,文章还将简要介绍如何使用Swagger生成API文档,使得API的测试和维护更加便捷。无论你是希望提升现有项目的API设计,还是想从零开始构建一个新项目,本文都将为你提供一条清晰的道路
|
2天前
|
测试技术 API 开发工具
📑教你如何编写一份 API 文档
API 文档是开发者理解和使用API的关键,它提供详细的说明、代码示例和调用过程,帮助创建无缝集成。好的API文档能提升开发人员体验,减少上手时间和维护成本,同时促进产品迭代。API有面向团队、合作伙伴和最终用户三种类型。编写文档时要考虑受众,提供清晰的概述、教程、认证信息、端点定义、状态码和错误码示例。维护更新与API同步的文档至关重要,遵循通俗语言、参考文档、示例和专人负责等最佳实践,确保全面性。GitHub、Twilio和Dropbox的API文档是良好示例。
|
9天前
|
缓存 监控 JavaScript
Node.js中构建RESTful API的最佳实践
【4月更文挑战第30天】本文介绍了在Node.js中构建RESTful API的最佳实践:选择合适的框架(如Express、Koa)、设计清晰的API接口(遵循HTTP动词和资源路径)、实现认证授权(JWT、OAuth 2.0)、错误处理、限流缓存、编写文档和测试,以及监控性能优化。这些实践有助于创建健壮、可维护和易用的API。
|
9天前
|
JavaScript API 开发者
深入了解Node.js的文件系统:Node.js文件系统API的使用与探索
【4月更文挑战第30天】本文深入探讨了Node.js的文件系统API,介绍了如何引入`fs`模块进行文件操作。内容包括异步读取和写入文件、删除文件、创建目录以及使用文件流进行高效操作。此外,还提到了文件系统的监视功能,帮助开发者全面掌握在Node.js中处理文件和目录的方法。
|
13天前
|
前端开发 Java 测试技术
IDEA 版 API 接口神器来了,一键生成文档,贼香!
IDEA 版 API 接口神器来了,一键生成文档,贼香!
36 0
|
23天前
|
JavaScript API
Node.js API实例讲解——FS 文件夹操作
Node.js API实例讲解——FS 文件夹操作
28 0
|
2月前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express构建RESTful API
使用Node.js和Express构建RESTful API
27 0