当前位置: 首页 > news >正文

Web 应用框架 Express 构建 RESTful API

Express框架

Express 是 Node.js 平台上最常用的 Web 应用框架之一,它简洁、灵活且易于使用。Express 提供了一组强大的功能和工具,可以帮助开发者快速构建 Web 应用程序和 RESTful API。

以下是 Express 框架的一些主要特点和功能:

  1. 轻量级:Express 是一个轻量级的框架,它提供了最基本的功能和工具,但没有过多的冗余代码。这使得 Express 很容易上手,并且可以自由地选择和集成其他中间件和插件。

  2. 快速路由:Express 提供了灵活的路由功能,可以根据不同的请求路径和 HTTP 方法来定义路由处理程序。这样可以方便地将请求映射到对应的处理逻辑。

  3. 中间件支持:Express 强大的中间件支持是其最大的特点之一。中间件是一个函数,可以在请求和响应之间进行处理,并且可以根据需要串联多个中间件。开发者可以使用已有的中间件或自定义中间件来实现各种功能,如身份验证、日志记录、错误处理等。

  4. 视图引擎:Express 允许使用各种视图引擎来渲染动态内容,如 EJS、Handlebars 等。视图引擎可以将数据和模板结合,生成最终的 HTML 页面,方便开发者构建动态的 Web 应用。

  5. 静态文件服务:Express 提供了一个简单的方式来提供静态文件,如图片、CSS 和 JavaScript 等。这样,开发者可以直接访问这些静态资源而无需额外的路由设置。

  6. RESTful API 支持:Express 对于构建 RESTful API 非常友好。通过合理设计路由和中间件,可以快速地构建符合 RESTful 风格的 API 接口。

  7. 社区活跃:Express 拥有一个庞大且活跃的开发社区,有大量的插件和中间件可以选择使用。这意味着开发者可以从社区中获得很多有用的资源和支持。

使用 Express 可以快速搭建 Web 应用程序,它是 Node.js 生态系统中最受欢迎和广泛应用的 Web 框架之一。无论是开发简单的网站还是复杂的 Web 应用,Express 都是一个值得选择的优秀框架。

Express搭建后端API示例

当使用 Express 框架来搭建一个请求 API、连接 MySQL 并生成 API 文档的后端时,需要分为以下几个步骤:

  1. 安装依赖: 首先,您需要确保您的 Node.js 环境已经安装,并且在项目根目录下运行以下命令来安装所需的依赖:
npm install express mysql body-parser swagger-jsdoc swagger-ui-express
  1. 创建 Express 应用: 创建一个 Express 应用并设置路由、连接数据库等。
const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const swaggerJSDoc = require('swagger-jsdoc');
const swaggerUI = require('swagger-ui-express');const app = express();
const port = process.env.PORT || 3000;// 解析请求体
app.use(bodyParser.json());// 连接 MySQL 数据库
const db = mysql.createConnection({host: 'localhost',user: 'username',password: 'password',database: 'database_name',
});db.connect((err) => {if (err) {console.error('Database connection failed: ', err);} else {console.log('Connected to the database');}
});// 示例 API 路由
app.get('/api/data', (req, res) => {db.query('SELECT * FROM data_table', (err, results) => {if (err) {console.error('Error querying database: ', err);res.status(500).send('Internal Server Error');} else {res.json(results);}});
});// 生成 Swagger 文档配置
const swaggerOptions = {definition: {openapi: '3.0.0',info: {title: 'API Documentation',version: '1.0.0',},},apis: ['./app.js'], // 指定包含 API 路由的文件
};const swaggerSpec = swaggerJSDoc(swaggerOptions);
app.use('/api-docs', swaggerUI.serve, swaggerUI.setup(swaggerSpec));app.listen(port, () => {console.log(`Server is running on port ${port}`);
});
  1. 生成 API 文档注释: 在您的 Express 应用代码中,为每个路由添加 Swagger 文档注释。
/*** @swagger* /api/data:*   get:*     summary: Get data from the database*     responses:*       200:*         description: Successful response with data*         content:*           application/json:*             example:*               - id: 1*                 name: Example Data*/
  1. 运行应用: 在项目根目录下运行以下命令以启动 Express 应用:
node app.js
  1. 访问 API 文档: 在浏览器中访问 http://localhost:3000/api-docs,您将能够看到生成的 Swagger API 文档。

上述代码示例仅仅是一个基本的 Express 应用,您可以根据您的需求对其进行扩展和定制。同时,您需要替换数据库连接信息以及示例路由和数据表等。此外,为了更好地组织代码,您可能需要将路由和数据库操作拆分为不同的模块。

Express 项目结构

对于一个大型的 Express 项目,合理的目录结构划分可以帮助提高代码的可维护性和扩展性。以下是一个常见的最优目录结构示例:

project/├── app/│    ├── controllers/│    ├── models/│    ├── routes/│    ├── middlewares/│    ├── services/│    └── utils/├── config/│    ├── env/│    └── config.js├── public/│    ├── css/│    ├── js/│    └── images/├── views/├── tests/├── app.js├── package.json└── README.md

目录结构含义说明:

  1. app/:存放应用程序的核心代码。

    • controllers/:控制器,用于处理请求和响应。
    • models/:数据模型,用于定义数据库模型和操作。
    • routes/:路由,用于定义各个路由和请求处理逻辑。
    • middlewares/:中间件,用于处理请求前或响应后的逻辑。
    • services/:服务层,用于处理业务逻辑。
    • utils/:工具函数,用于存放一些常用的工具函数。
  2. config/:存放项目的配置文件。

    • env/:不同环境的配置文件,如开发环境、生产环境等。
    • config.js:通用配置文件,如数据库连接、端口号等。
  3. public/:存放静态资源文件,如 CSS、JavaScript、图片等。

  4. views/:存放视图文件,用于渲染前端页面。

  5. tests/:存放测试代码,用于对项目进行单元测试和集成测试。

  6. app.js:应用的入口文件,负责启动 Express 应用并设置中间件。

  7. package.json:项目的配置文件,包含依赖项和脚本等信息。

  8. README.md:项目的说明文档,用于描述项目的功能和使用方法。

这种目录结构将不同的功能模块进行了清晰的划分,使得代码组织更加有序和易于维护。同时,使用配置文件存放环境相关的配置信息,可以方便地在不同环境中切换配置,从而提高了项目的灵活性和可配置性。

Swagger API 文档

Swagger API 文档(也称为 OpenAPI 文档)是一个描述 RESTful API 的标准化规范,它使用 YAML 或 JSON 格式来定义 API 的结构、路径、参数、响应和其他相关信息。Swagger API 文档的目标是提供一种统一的方式来描述和共享 API 的信息,使开发者和团队能够更轻松地了解、使用和测试 API。

以下是 Swagger API 文档的一些核心组成部分和介绍:

  1. 基本信息: API 文档中包含一些基本信息,如 API 的标题、版本、描述等。这些信息帮助其他开发者了解 API 的基本信息。

  2. 路径和操作: 文档中列出了 API 提供的不同路径和操作(HTTP 方法),以及每个操作的详细信息。例如,GET、POST、PUT、DELETE 等操作。

  3. 请求参数: 对于每个操作,API 文档会描述该操作所需的输入参数。这包括查询参数、路径参数、请求体参数等。

  4. 响应定义: API 文档定义了每个操作的响应结构,包括 HTTP 状态码、响应体的数据类型和结构。

  5. 错误响应: 文档通常也会列出操作可能返回的错误响应,包括错误码、错误消息和错误细节。

  6. 数据类型和模型: API 文档可以定义各种数据类型和模型,以用于请求和响应的数据结构。这可以帮助开发者更好地理解数据的格式和结构。

  7. 安全和授权: Swagger API 文档可以定义 API 的安全要求和授权机制,以及如何进行身份验证和权限控制。

  8. 示例和代码: 文档可以提供示例请求和响应,以及不同编程语言的代码示例,帮助开发者更好地了解如何使用 API。

  9. API 文档工具: 使用 Swagger 工具可以将 API 文档渲染成交互式的 Swagger UI,使开发者能够直观地浏览、测试和调试 API。

在您的 API 路由处理文件中,您需要为每个 API 添加 Swagger 注释,以指定其操作和参数。例如,以下是如何为 “获取所有用户信息” 这个 API 添加 Swagger 注释:

// routes/userRoutes.js/*** @swagger* /api/users:*   get:*     summary: 获取所有用户信息*     description: 获取所有用户信息的API端点*     responses:*       200:*         description: 成功获取用户信息*       500:*         description: 服务器内部错误*/
router.get('/', (req, res) => {// 在这里编写获取所有用户信息的逻辑
});

您需要为每个 API 添加类似的 Swagger 注释,包括请求方法(GET、POST、PUT、DELETE)、路径、操作概要(summary)、操作描述(description)和响应(responses)信息。根据您的实际 API 实现,确保在注释中提供正确的信息。
在线调试

总之,Swagger API 文档是一个标准化的规范,用于描述 RESTful API 的各个方面。通过使用 Swagger 工具,您可以根据 API 文档自动生成交互式的 API 文档界面,使开发者和团队更容易理解和使用 API。

相关文章:

Web 应用框架 Express 构建 RESTful API

Express框架 Express 是 Node.js 平台上最常用的 Web 应用框架之一,它简洁、灵活且易于使用。Express 提供了一组强大的功能和工具,可以帮助开发者快速构建 Web 应用程序和 RESTful API。 以下是 Express 框架的一些主要特点和功能: 轻量级…...

Orchestrator介绍一 简介安装与web端管理

目录 一 Orchestrator简介 二 Orchestrator功能 1 Discovery(发现复制拓扑) 2 Refactoring(重构复制拓扑) 3 Recovery(恢复主库故障) 三 orchestrator支持的操作方式 四 部署要求 五 下载 六 安装 1 下载软件包 2 解压软件包 3 创建账号 第一种是 orc后端MySQL数据…...

【C++心愿便利店】No.3---内联函数、auto、范围for、nullptr

文章目录 前言🌟一、内联函数🌏1.1.面试题🌏1.2.内联函数概念🌏1.3.内联函数特性 🌟二、auto关键字🌏2.1.类型别名思考🌏2.2.auto简介🌏2.3.auto的使用细节🌏2.4.auto不能…...

CV:边缘检测的算法包含 Prewitt、Sobel、Laplacian 和 Canny。

目录 1. 边缘检测(Prewitt) 2. 边缘检测(Sobel) 3. 边缘检测(Laplacian) 3. 边缘检测(Canny) 边缘检测的算法包含 Prewitt、Sobel、Laplacian 和 Canny。 人在图像识别上具有难…...

【算法系列篇】前缀和

文章目录 前言什么是前缀和算法1.【模板】前缀和1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 【模板】二维前缀和2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 寻找数组的中心下标3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 除自身以外的数组的乘积4.1 题目要求4.2 做题思…...

若依移动端Ruoyi-App 项目的后端项目入门

后端项目运行 运行报错 Error creating bean with name sysConfigServiceImpl: Invocation of init method failed 数据库创建了。 代码连接数据库地方了也匹配上了。但是还是报错。 分析 : 想起来我电脑从来没有安装过redis 下载安装redis到windows 链接&…...

(学习笔记-调度算法)内存页面置换算法

在了解内存页面置换算法前,我们得先了解 缺页异常(缺页中断)。 当 CPU 访问的页面不在物理内存中时,便会产生一个缺页中断,请求操作系统将缺页调入到物理内存。那它与一般的中断主要区别在于: 缺页中断在指令执行 [期…...

行为型模式-观察者模式

1.观察者设计模式* 定义:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 意图:定义对象间的…...

前端面试:【新技术与趋势】WebAssembly、Serverless、GraphQL

在不断演进的技术领域中,WebAssembly、Serverless和GraphQL都是备受关注的新技术和趋势。它们改变了软件开发、部署和数据传输的方式,为开发者提供了更多的选择和灵活性。 1. WebAssembly(Wasm): 简介: Web…...

【ubuntu】 20.04 网络连接器图标不显示、有线未托管、设置界面中没有“网络”选项等问题解决方案

问题 在工作中 Ubuntu 20.04 桌面版因挂机或不当操作,意外导致如下问题 1、 Ubuntu 网络连接图标消失 2、 有线未托管 上图中展示的是 有线 已连接 ,故障的显示 有限 未托管 或其他字符 3、 ”设置“ 中缺少”网络“选项 上图是设置界面&#xff0c…...

SpringCloud/SpringBoot多模块项目中配置公共AOP模块实现打印子模块Controller所有请求参数与日志

项目中遇到多个模块需要打印Controller请求日志,在每个模块里面加AOP并且配置单独的切面笔者认为代码冗余,于是乎就打算把AOP日志打印抽离成一个公共模块,谁想用就引入Maven坐标就行。 定义公共AOP模块 并编写AOP工具 AOP模块pom.xml如下 &…...

【GeoDa实用技巧100例】022:geoda生成空间权重矩阵(邻接矩阵、距离矩阵)

geoda生成空间权重矩阵(邻接矩阵、距离矩阵),车式矩阵、后式矩阵、K邻接矩阵。 文章目录 一、概述二、“车式”邻接的gal文档生成三、“后式”邻接gal文档生成四、k最近邻居gat文档生成五、查看gal和gat文档一、概述 空间权重矩阵(或相应的表格形式)一般需要用计算机软件生…...

基于web的鲜花商城系统java jsp网上购物超市mysql源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于web的鲜花商城系统 系统有2权限:前台…...

意外发现Cortex-M内核带的64bit时间戳,比32bit的DWT时钟周期计数器更方便,再也不用担心溢出问题了

视频: https://www.bilibili.com/video/BV1Bw411D7F5 意外发现Cortex-M内核带的64bit时间戳,比32bit的DWT时钟周期计数器更方便,再也不用担心溢出问题了 介绍: 看参数手册的Debug章节,System ROM Table里面带Timestam…...

数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。

文章目录 前言一、单源最短路径1、单源最短路径问题2、Dijkstra 初始化a、参数b、初始化参数c、算法步骤 3、Dijkstra 算法详细步骤a、第一轮算法执行b、第二轮算法执行c、第三轮算法执行d、第四轮算法执行e、第五轮算法执行f、第六轮算法执行 4、java算法实现 二、多源最短路径…...

改进YOLO系列:6.添加ECA注意力机制

添加ECA注意力机制 1. ECA注意力机制论文2. ECA注意力机制原理3. ECA注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. ECA注意力机制论文 论文题目:ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 论文链接:ECA-N…...

软件测试知识点总结(一)

文章目录 前言一. 什么是软件测试二. 软件测试和软件调试的区别三. 软件测试和研发的区别四. 优秀的测试人员所应该具备的素质总结 前言 在现实生活中的很多场景下,我们都会进行测试。 比如买件衣服,我们需要看衣服是不是穿着好看,衣服材质如…...

持续集成与持续交付:现代软件测试的变革之路

引言 在数字化时代,软件开发的速度和复杂性都在不断增加。为了满足市场的需求,企业需要更快、更高效地交付高质量的软件产品。在这样的背景下,持续集成与持续交付(CI/CD)成为了软件开发和测试的核心实践。 软件开发的…...

深度学习基本理论下篇:(梯度下降/卷积/池化/归一化/AlexNet/归一化/Dropout/卷积核)、深度学习面试

深度学习基本理论上篇:(MLP/激活函数/softmax/损失函数/梯度/梯度下降/学习率/反向传播) 深度学习基本理论上篇:(MLP/激活函数/softmax/损失函数/梯度/梯度下降/学习率/反向传播)、深度学习面试_会害羞的杨…...

[Ubuntu 20.04] 通过udev规则修改网卡名称(例如eth0)

在 Ubuntu 20.04 操作系统中,默认情况下,网卡接口名称采用了一种较为复杂的命名方式(如 enp0s3、eth0 等)。然而,有时候我们可能更希望使用更简洁和易于识别的名称来标识不同的网络接口。那么如何在 Ubuntu 20.04 中修改网卡接口的名称,以满足个性化需求。 步骤一:查看当…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式(偏导…...

PydanticAI快速入门示例

参考链接:https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒&#xf…...