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

Express知识框架

一、核心概念

1. Express 简介

  • Node.js 的 Web 框架,提供 HTTP 服务器封装

  • 轻量级但灵活,支持中间件扩展

  • 基于路由,支持 RESTful API 和传统 MVC 架构

  • 无内置 ORM 或模板引擎,但可集成第三方库

2. 核心对象

  • express() - 创建 Express 应用

  • app (Application 对象) - 管理全局中间件、路由、服务器

  • req (Request 对象) - 封装 HTTP 请求信息

  • res (Response 对象) - 封装 HTTP 响应方法

  • router (Router 对象) - 模块化路由管理


二、核心功能

1. 路由系统

(1) 基本路由
app.METHOD(path, handler)  // GET, POST, PUT, DELETE, etc.
app.all(path, handler)     // 匹配所有 HTTP 方法
app.route(path)            // 链式路由定义
(2) 路由参数
app.get('/users/:id', (req, res) => {const userId = req.params.id;  // 获取动态参数
});
(3) 查询字符串
app.get('/search', (req, res) => {const query = req.query.q;  // /search?q=express
});
(4) 模块化路由 (Router)
const router = express.Router();
router.get('/', (req, res) => { ... });
app.use('/api', router);  // 挂载到 /api 路径

2. 中间件(Middleware)

(1) 基本概念
  • 函数签名(req, res, next) => { ... }

  • 执行顺序:按 app.use() 顺序执行

  • 作用:修改请求/响应、执行额外逻辑、终止请求

(2) 中间件类型
类型示例说明
应用级app.use(logger)全局中间件
路由级router.use(auth)路由专属中间件
错误处理(err, req, res, next)捕获错误
内置express.json()解析 JSON
第三方morgan日志记录
(3) 常用内置中间件
app.use(express.json());          // 解析 JSON 请求体
app.use(express.urlencoded());    // 解析表单数据
app.use(express.static('public')); // 静态文件服务
(4) 自定义中间件示例
const logger = (req, res, next) => {console.log(`${req.method} ${req.url}`);next();  // 继续执行后续中间件
};
app.use(logger);

3. 请求与响应处理

(1) Request (req) 常用属性/方法
属性/方法说明
req.params路由参数 (/users/:id)
req.query查询参数 (?name=express)
req.body请求体(需 body-parser
req.headers请求头
req.cookiesCookie(需 cookie-parser
(2) Response (res) 常用方法
方法说明
res.send()发送响应(自动设置 Content-Type)
res.json()发送 JSON
res.status()设置状态码
res.redirect()重定向
res.render()渲染模板(需模板引擎)
res.sendFile()发送文件
res.set()设置响应头

4. 模板引擎(可选)

(1) 常用引擎
  • EJS(嵌入式 JS)

  • Pug(缩进语法)

  • Handlebars(Mustache 风格)

(2) 配置示例
app.set('views', './views');  // 模板目录
app.set('view engine', 'ejs'); // 使用 EJS
app.get('/', (req, res) => {res.render('index', { title: 'Express' }); // 渲染模板
});

三、高级功能

1. 错误处理

(1) 基本错误处理
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('Server Error!');
});
(2) 异步错误处理
app.get('/', async (req, res, next) => {try {await someAsyncOperation();} catch (err) {next(err);  // 传递给错误处理中间件}
});

2. 静态文件服务

app.use(express.static('public'));  // 访问 public/ 目录
app.use('/static', express.static('files'));  // 自定义路径

3. Cookie & Session 管理

(1) Cookie
const cookieParser = require('cookie-parser');
app.use(cookieParser());
res.cookie('name', 'value', { maxAge: 900000 });
req.cookies.name;  // 读取 Cookie
(2) Session
const session = require('express-session');
app.use(session({ secret: 'keyboard cat', resave: false }));
req.session.user = { name: 'John' };  // 设置 Session

4. 文件上传

const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.single('file'), (req, res) => {console.log(req.file);  // 文件信息
});

四、安全最佳实践

1. 安全中间件

const helmet = require('helmet');
app.use(helmet());  // 设置安全 HTTP 头

2. CORS 处理

const cors = require('cors');
app.use(cors());  // 允许跨域请求

3. CSRF 防护

const csrf = require('csurf');
app.use(csrf({ cookie: true }));

4. 速率限制

const rateLimit = require('express-rate-limit');
const limiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 100 });
app.use(limiter);

五、部署与优化

1. 生产环境配置

  • 使用 NODE_ENV=production

  • 启用压缩 (compression 中间件)

  • 反向代理(Nginx/Apache)

  • 日志管理(morgan + winston

2. 进程管理(PM2)

pm2 start app.js --name "express-server" --watch

六、总结对比(Express vs Koa vs NestJS)

特性ExpressKoaNestJS
中间件模型线性执行洋葱圈模块化 + 依赖注入
异步处理回调async/awaitasync/await
内置功能较少极少丰富(ORM、微服务等)
适用场景传统 Web 服务轻量级 API企业级应用

七、学习资源

  • Express 官方文档

  • Express 中间件列表

  • Express 最佳实践

Express 是 Node.js 最流行的 Web 框架,适合快速开发 API 和传统 Web 应用。掌握其核心概念(路由、中间件、请求/响应)后,可结合各种中间件扩展功能。

http://www.xdnf.cn/news/5521.html

相关文章:

  • Linux常用命令详解(下):打包压缩、文本编辑与查找命令
  • C++GO语言微服务之Dockerfile docker-compose
  • 手机换地方ip地址会变化吗?深入解析
  • CSS3 伪元素(Pseudo-elements)大全
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(二十二)
  • 【25软考网工】第六章(4)VPN虚拟专用网 L2TP、PPTP、PPP认证方式;IPSec、GRE
  • USB传输模式
  • 大语言模型强化学习双强:OpenRLHF与verl技术解析
  • Golang空接口的用途详解
  • pnpm使用报错
  • TWASandGWAS中GBS filtering and GWAS(1)
  • 黑马点评实战笔记
  • AI赋能安全生产,推进数智化转型的智慧油站开源了。
  • BUUCTF——PYWebsite
  • 记一种C#winform小程序的简易打包方式-自解压压缩文件
  • 火山RTC 7 获得远端裸数据
  • MATLAB机器人系统工具箱中的loadrobot和importrobot
  • Voice Changer 变声器
  • C++语法基础(上)
  • linux内核pinctrl/gpio子系统驱动笔记
  • 并行发起http请求
  • Spring Cloud : OpenFeign(远程调用)
  • 腾答知识竞赛系统 V1.0.4更新
  • Linux文件编程——open函数
  • CAPL -实现SPRMIB功能验证
  • 《操作系统真象还原》第十四章(1)——文件系统概念、创建文件系统
  • 写屏障和读屏障的区别是什么?
  • 思维链是仅仅通过提示词实现的吗
  • Java对象的内存分布(二)
  • Python训练营打卡——DAY22(2025.5.11)