Egg.js知识框架
一、Egg.js 核心概念
1. Egg.js 简介
-
基于 Koa 的企业级 Node.js 框架(阿里开源)
-
约定优于配置(Convention over Configuration)
-
插件化架构,内置多进程管理、日志、安全等能力
-
适合中大型企业应用,提供完整 MVC 解决方案
二、核心架构
1. 目录结构(约定式)
egg-project
├── app
│ ├── controller # 控制器
│ ├── service # 业务逻辑
│ ├── model # 数据模型(可选)
│ ├── middleware # 中间件
│ ├── router.js # 路由配置
│ └── extend # 扩展(helper、filter等)
├── config
│ ├── config.default.js # 默认配置
│ ├── config.prod.js # 生产环境配置
│ └── plugin.js # 插件配置
└── test # 单元测试
2. 核心对象
对象 | 说明 |
---|---|
Application | 全局应用对象(单例) |
Context | 请求上下文(封装 request/response ) |
Controller | 处理用户输入,返回响应 |
Service | 业务逻辑封装 |
Helper | 工具函数 |
Logger | 日志对象 |
三、核心功能
1. 路由系统
(1) 基本路由(app/router.js
)
module.exports = app => {const { router, controller } = app;router.get('/user/:id', controller.user.info); // RESTful 风格router.post('/api/login', controller.auth.login);
};
(2) RESTful 路由
router.resources('posts', '/api/posts', controller.posts); // 自动生成 CRUD 路由
(3) 路由中间件
router.get('/admin', app.middleware.auth(), controller.admin.index);
2. 控制器(Controller)
(1) 基本结构
// app/controller/user.js
const Controller = require('egg').Controller;class UserController extends Controller {async info() {const { ctx } = this;const userId = ctx.params.id;const user = await ctx.service.user.find(userId);ctx.body = user;}
}
(2) 常用 ctx
方法
方法 | 说明 |
---|---|
ctx.query | 获取查询参数 |
ctx.params | 获取路由参数 |
ctx.request.body | 获取请求体(需 bodyParser ) |
ctx.redirect(url) | 重定向 |
ctx.render(view, data) | 渲染模板 |
ctx.status = 200 | 设置状态码 |
3. 服务(Service)
-
业务逻辑封装(避免 Controller 臃肿)
-
可复用(多个 Controller 调用同一个 Service)
-
支持
async/await
示例
// app/service/user.js
const Service = require('egg').Service;class UserService extends Service {async find(id) {return await this.app.mysql.get('user', { id });}
}
调用方式
const user = await ctx.service.user.find(1);
4. 中间件(Middleware)
(1) 编写中间件
// app/middleware/auth.js
module.exports = (options, app) => {return async (ctx, next) => {if (!ctx.session.user) {ctx.throw(401, 'Unauthorized');}await next();};
};
(2) 注册中间件
// config/config.default.js
exports.middleware = ['auth']; // 全局中间件// 或局部使用
router.get('/admin', app.middleware.auth(), controller.admin.index);
5. 插件系统
(1) 官方插件
插件 | 用途 |
---|---|
egg-mysql | MySQL 数据库 |
egg-sequelize | Sequelize ORM |
egg-redis | Redis 客户端 |
egg-validate | 参数校验 |
egg-jwt | JWT 认证 |
(2) 配置插件
// config/plugin.js
exports.mysql = {enable: true,package: 'egg-mysql',
};// config/config.default.js
exports.mysql = {client: {host: '127.0.0.1',port: '3306',user: 'root',password: '123456',database: 'test',},
};
四、数据操作
1. 数据库(MySQL/Sequelize)
(1) 使用 egg-mysql
// 查询
const user = await this.app.mysql.get('user', { id: 1 });// 插入
await this.app.mysql.insert('user', { name: 'Tom' });// 更新
await this.app.mysql.update('user', { name: 'Jerry' }, { where: { id: 1 } });
(2) 使用 egg-sequelize
// app/model/user.js
module.exports = app => {const { STRING, INTEGER } = app.Sequelize;return app.model.define('user', {name: STRING,age: INTEGER,});
};// 查询
const user = await ctx.model.User.findOne({ where: { id: 1 } });
2. Redis
// 存储
await app.redis.set('key', 'value');// 读取
const value = await app.redis.get('key');
五、安全与优化
1. 安全机制
功能 | 说明 |
---|---|
CSRF 防护 | 默认开启(需 ctx.csrf 获取 token) |
XSS 过滤 | 内置 egg-security 中间件 |
SQL 注入防护 | ORM 自动转义 |
HTTPS 支持 | 配置 config.prod.js |
2. 性能优化
优化点 | 方法 |
---|---|
多进程 | 基于 cluster 自动管理 |
缓存 | Redis + 内存缓存 |
日志切割 | egg-logrotator |
静态资源 CDN | 配置 config.static |
六、测试与部署
1. 单元测试
// test/controller/user.test.js
const { app, mock } = require('egg-mock');describe('GET /user/:id', () => {it('should return user info', () => {return app.httpRequest().get('/user/1').expect(200);});
});
2. 部署方式
方式 | 说明 |
---|---|
PM2 | pm2 start npm -- start |
Docker | 官方提供 egg-docker |
Serverless | 阿里云 FC / AWS Lambda |
七、总结对比(Express vs Koa vs Egg vs NestJS)
特性 | Express | Koa | Egg | NestJS |
---|---|---|---|---|
定位 | 轻量级 | 更现代的 Koa | 企业级 | 全栈框架 |
中间件模型 | 线性 | 洋葱圈 | 增强版 Koa | 模块化 + DI |
适合场景 | 小型 API | 轻量级应用 | 中大型应用 | 复杂后端 |
八、学习资源
-
Egg.js 官方文档
-
Egg.js 最佳实践
-
阿里云 Egg.js 教程
Egg.js 适合需要标准化、可维护的企业级 Node.js 开发,尤其适合团队协作项目。 🚀
相关文章:
Egg.js知识框架
一、Egg.js 核心概念 1. Egg.js 简介 基于 Koa 的企业级 Node.js 框架(阿里开源) 约定优于配置(Convention over Configuration) 插件化架构,内置多进程管理、日志、安全等能力 适合中大型企业应用,提供…...

随手记录5
一些顶级思维: 顶级思维 1、永远不要自卑。 也永远不要感觉自己比别人差,这个人有没有钱,有多少钱,其实跟你都没有关系。有很多人就是那个奴性太强,看到比自己优秀的人,甚至一些装逼的人,这…...

Linux驱动:驱动编译流程了解
要求 1、开发板中的linux的zImage必须是自己编译的 2、内核源码树,其实就是一个经过了配置编译之后的内核源码。 3、nfs挂载的rootfs,主机ubuntu中必须搭建一个nfs服务器。 内核源码树 解压 tar -jxvf x210kernel.tar.bz2 编译 make x210ii_qt_defconfigmakeCan’t use ‘…...

使用 Flowise 构建基于私有知识库的智能客服 Agent(图文教程)
使用 Flowise 构建基于私有知识库的智能客服 Agent(图文教程) 在构建 AI 客服时,常见的需求是让机器人基于企业自身的知识文档,提供准确可靠的答案。本文将手把手教你如何使用 Flowise + 向量数据库(如 Pinecone),构建一个结合 RAG(Retrieval-Augmented Generation)检…...

RabbitMQ ③-Spring使用RabbitMQ
Spring使用RabbitMQ 创建 Spring 项目后,引入依赖: <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifac…...
测试文章标题01
模型上下文协议(Model Context Protocol, MCP)深度解析 一、MCP的核心概念 模型上下文协议(Model Context Protocol, MCP)是一种用于规范机器学习模型与外部环境交互的标准化框架。其核心目标是通过定义统一的接口和数据格式&am…...

linux中常用的命令(四)
目录 1-cat查看文件内容 2-more命令 3-less命令 4-head命令 5-tail命令 1-cat查看文件内容 cat中的一些操作 -b : 列出行号(不含空白行)-E : 将结尾的断行以 $ 的形式展示出来-n : 列出行号(含空白行)-T : 将 tab 键 以 ^I 显示…...
2025年阿里云大数据ACP高级工程师认证模拟试题(附答案解析)
这篇文章的内容是阿里云大数据ACP高级工程师认证考试的模拟试题。 所有模拟试题由AI自动生成,主要为了练习和巩固知识,并非所谓的 “题库”,考试中如果出现同样试题那真是纯属巧合。 1、下列关于MaxCompute的描述中,错误的是&am…...
【FAQ】HarmonyOS SDK 闭源开放能力 — PDF Kit
1.问题描述: 预览PDF文件,文档上所描述的loadDocument接口,可以返回文件的状态,并无法实现PDF的预览,是否有能预览PDF相关接口? 解决方案: 1、执行loadDocument进行加载PDF文件后,…...
二元随机响应(Binary Randomized Response, RR)的翻转概率
随机响应(Randomized Response)机制 ✅ 回答核心: p 1 1 e ε 才是「翻转概率」 \boxed{p \frac{1}{1 e^{\varepsilon}}} \quad \text{才是「翻转概率」} p1eε1才是「翻转概率」 而: q e ε 1 e ε 是「保留真实值」…...
hive两个表不同数据类型字段关联引发的数据倾斜
不同数据类型引发的Hive数据倾斜解决方案 #### 一、原因分析 当两个表的关联字段存在数据类型不一致时(如int vs string、bigint vs decimal),Hive会触发隐式类型转换引发以下问题: Key值的精度损失:若关联字…...

利用SSRF击穿内网!kali靶机实验
目录 1. 靶场拓扑图 2. 判断SSRF的存在 3. SSRF获取本地信息 3.1. SSRF常用协议 3.2. 使用file协议 4. 172.150.23.1/24探测端口 5. 172.150.23.22 - 代码注入 6. 172.150.23.23 SQL注入 7. 172.150.23.24 命令执行 7.1. 实验步骤 8. 172.150.23.27:6379 Redis未授权…...

DVWA在线靶场-xss部分
目录 1. xxs(dom) 1.1 low 1.2 medium 1.3 high 1.4 impossible 2. xss(reflected) 反射型 2.1 low 2.2 medium 2.3 high 2.4 impossible 3. xss(stored)存储型 --留言板 3.1 low 3.2 medium 3.3 high 3.…...

Go 语言 slice(切片) 的使用
序言 在许多开发语言中,动态数组是必不可少的一个组成部分。在实际的开发中很少会使用到数组,因为对于数组的大小大多数情况下我们是不能事先就确定好的,所以他不够灵活。动态数组通过提供自动扩容的机制,极大地提升了开发效率。这…...
Android Exoplayer 实现多个音视频文件混合播放以及音轨切换
在之前的文章ExoPlayer中常见MediaSource子类的区别和使用场景中介绍了Exoplayer中各种子MediaSource的使用场景,这篇我们着重详细介绍下实现多路流混合播放的用法。常见的使用场景有:视频文件电影字幕、正片视频广告视频、背景视频背景音乐等。 初始化…...
深入浅出:Java 中的动态类加载与编译技术
1. 引言 Java 的动态性是其强大功能之一,允许开发者在运行时加载和编译类,从而构建灵活、可扩展的应用程序。动态类加载和编译在许多高级场景中至关重要,例如插件系统、动态代理、框架开发(如 Spring)和代码生成工具。Java 提供了两大核心机制来实现这一目标: 自定义 Cl…...

js常用的数组遍历方式
以下是一个完整的示例,将包含图片、文字和数字的数组渲染到 HTML 页面,使用 多种遍历方式 实现不同的渲染效果: 1. 准备数据(数组) const items [{ id: 1, name: "苹果", price: 5.99, image: "h…...

【网络编程】五、三次握手 四次挥手
文章目录 Ⅰ. 三次握手Ⅱ. 建立连接后的通信Ⅲ. 四次挥手 Ⅰ. 三次握手 1、首先双方都是处于未通信的状态,也就是关闭状态 CLOSE。 2、因为服务端是为了服务客户端的,所以它会提前调用 listen() 函数进行对客户端请求的监听。 3、接着客户端就…...
【类拷贝文件的运用】
常用示例 当我们面临将文本文件分成最大大小块的时,我们可能会尝试编写如下代码: public class TestSplit {private static final long maxFileSizeBytes 10 * 1024 * 1024; // 默认10MBpublic void split(Path inputFile, Path outputDir) throws IOException {…...

从 AGI 到具身智能体:解构 AI 核心概念与演化路径全景20250509
🤖 从 AGI 到具身智能体:解构 AI 核心概念与演化路径全景 作者:AI 应用实践者 在过去的几年中,AI 领域飞速发展,从简单的文本生成模型演进为今天具备复杂推理、感知能力的“智能体”系统。本文将从核心概念出发&#x…...

Docker Compose 的历史和发展
这张图表展示了Docker Compose从V1到V2的演变过程,并解释了不同版本的Compose文件格式及其支持情况。以下是对图表的详细讲解: Compose V1 No longer supported: Compose V1已经不再支持。Compose file format 3.x: 使用了版本3.x的Compose文件格式。 …...
ARMV8 RK3399 u-boot TPL启动流程分析 --crt0.S
上一篇介绍到start.S 最后一个指令是跳转到_main, 接下来分析 __main 都做了什么 arch/arm/lib/crt0.S __main 注释写的很详细,主要分为5步 1. 准备board_init_f的运行环境 2. 跳转到board_init_f 3. 设置broad_init_f 申请的stack 和 GD 4. 完整u-boot 执行re…...

从 JIT 即时编译一直讲到CGI|FastGGI|WSGI|ASGI四种协议的实现细节
背景 我一度理解错了这个东西,之前没有AI的时候,也没深究过,还觉得PHP8支持了常驻内存的运行的错误理解,时至今日再来看这个就很清晰了。 另外,早几年对以上4个协议,我也没搞懂,时至今日&…...
Vue.js 页面切换空白与刷新 404 问题深度解析
在使用 Vue.js 开发单页应用 (SPA) 的过程中,开发者经常会遇到两个常见问题:页面切换时出现短暂的空白屏幕,以及刷新页面时返回 404 错误。这两个问题不仅影响用户体验,还可能阻碍项目的正常上线。本文将深入探讨这两个问题的成因…...

CSS3 遮罩
在网页设计中,我们经常需要实现一些特殊的视觉效果来增强用户体验。CSS3 遮罩(mask)允许我们通过控制元素的可见区域来创建各种精美的视觉效果。本文将带你全面了解 CSS3 遮罩的功能和应用。 什么是 CSS3 遮罩? CSS3 遮罩是一种…...

ResNet残差神经网络的模型结构定义(pytorch实现)
ResNet残差神经网络的模型结构定义(pytorch实现) ResNet‑34 ResNet‑34的实现思路。核心在于: 定义残差块(BasicBlock)用 _make_layer 方法堆叠多个残差块按照 ResNet‑34 的通道和层数配置来搭建网络 import torch…...

uniapp|商品列表加入购物车实现抛物线动画效果、上下左右抛入、多端兼容(H5、APP、微信小程序)
以uniapp框架为基础,详细解析商品列表加入购物车抛物线动画的实现方案。通过动态获取商品点击位置与购物车坐标,结合CSS过渡动画模拟抛物线轨迹,实现从商品图到购物车图标的动态效果。 目录 核心实现原理坐标动态计算抛物线轨迹模拟动画元素控制代码实现详解模板层设计脚本…...

谈AI/OT 的融合
过去的十几年间,工业界讨论最多的话题之一就是IT/OT 融合,现在,我们不仅要实现IT/OT 的融合,更要面向AI/OT 的融合。看起来不太靠谱,却留给我们无限的想象空间。OT 领域的专家们不要再当“九斤老太”,指责这…...

USB传输模式
USB有四种传输模式: 控制传输, 中断传输, 同步传输, 批量传输 1. 中断传输 中断传输一般用于小批量, 非连续的传输. 对实时性要求较高. 常见的使用此传输模式的设备有: 鼠标, 键盘等. 要注意的是, 这里的 “中断” 和我们常见的中断概念有差异. Linux中的中断是设备主动发起的…...
Tomcat的`context.xml`配置详解!
全文目录: 开篇语前言一、context.xml 文件的基本结构二、常见的 context.xml 配置项1. **数据源(DataSource)配置**示例: 2. **日志配置**示例: 3. **设置环境变量(Environment Variables)**示…...