Express知识框架

news2025/5/13 16:42:05

一、核心概念

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.coloradmin.cn/o/2374788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp + vue3 + 京东Nut动作面板组件:实现登录弹框组件(含代码、案例、小程序截图)

uniapp + vue3 + 京东Nut动作面板组件:实现登录弹框组件(含代码、案例、小程序截图) 代码示下,不再赘述。 动作面板组件:https://nutui-uniapp.netlify.app/components/feedback/actionsheet.html 项目背景 业务需求 描述: uniapp + vue3 + 京东Nut框架:实现登录弹框组…

C++类和对象--中阶

C类和对象中阶 01. 类的6个默认成员函数 在 C 中,类有 6 个特殊的默认成员函数(不是 6 个构造函数),它们会在特定情况下由编译器自动生成。包括构造函数,析构函数,拷贝构造和赋值运算符重载,取…

数据签名在区块链中的独特应用与挑战

随着信息技术的飞速发展,分布式系统因其高效、可靠、可扩展等显著优点,在众多领域得到了极为广泛的应用。分布式系统通过网络将多个独立的计算节点连接在一起,协同完成复杂的任务,这种架构使得系统具备了强大的容错能力和负载均衡…

数据可视化大屏——物流大数据服务平台(二)

代码分析: 物流大数据平台代码分析 这是一个基于 Bootstrap 和 ECharts 构建的物流大数据平台前端页面,设计采用了经典的三栏布局,主要展示河南省及全国的物流数据可视化内容。下面从多个维度进行分析: 1. 页面结构分析 整体采…

Maven 处理依赖冲突

Maven处理依赖冲突 什么是依赖冲突?如何解决?Maven自动处理依赖冲突的规则路径优先原则第一声明优先原则注意 子模块覆盖父模块父模块声明dependency子模块覆盖dependency父模块声明dependencyManagement 子模块覆盖dependency父模块声明dependencyManag…

5.12第四次作业

实验要求:完成上图内容,要求五台路由器的环回地址均可以相互访问 AR1 AR2 AR3 AR4 AR5 AS 200 ospf配置 AR2 AR3 AR4 BGP配置 AR1(AS100) AR2(AS200) AR4 AR5(AS300) 结果

【Lattice FPGA 开发】Diamond在线调试Reveal逻辑乱跳的解决

在Vivado中在always块中写逻辑时如果出现always块中的异步复位敏感词在块内部未使用的情况&#xff0c;如下例的rst&#xff1a; always (posedge clk or posedge rst) begin if(~tx_sense_flag)o_rd_adr < d1;else if((o_rd_adr d94) & (bit_cnt d7))o_rd_adr <…

Go语言——kratos微服务框架使用

文章目录 一、安装依赖二、创建项目三、初始化项目四、使用git_bash命令终端运行命令五、创建自己的项目1、修改app.proto3、internal/service/app.go4、修改internal/service/service.go文件5、创建internal/biz/content.go文件6、修改internal/biz/biz.go文件7、创建internal…

hiveserver2与beeline进行远程连接hive配置及遇到的问题

1、hiveserver2 参与用户模拟功能&#xff0c;因为开启后才能保证各用户之间的权限隔离。 1.1、配置 $HADOOP_HOME/etc/hadoop/core-site.xml <!--配置所有节点的root用户都可作为代理用户--> <property><name>hadoop.proxyuser.root.hosts</name>&…

Stable Diffusion进阶之Controlnet插件使用

前面已经对Stable Diffusion的文生图和图生图的操作界面做了详细的介绍&#xff0c;接下来会介绍Stable Diffusion的进阶部分Controlnet插件的使用。往期文章详见&#xff1a; 爆肝整理&#xff01;Stable Diffusion的完全使用手册&#xff08;一&#xff09;爆肝整理&#xff…

Multisim14使用教程详尽版--(2025最新版)

一、Multisim14前言 1.1、主流电路仿真软件 1. Multisim&#xff1a;NI开发的SPICE标准仿真工具&#xff0c;支持模拟/数字电路混合仿真&#xff0c;内置丰富的元件库和虚拟仪器&#xff08;示波器、频谱仪等&#xff09;&#xff0c;适合教学和竞赛设计。官网&#xff1a;艾…

使用Stable Diffusion(SD)中,步数(Steps)指的是什么?该如何使用?

Ⅰ定义&#xff1a; 在Stable Diffusion&#xff08;SD&#xff09;中&#xff0c;步数&#xff08;Steps&#xff09; 指的是采样过程中的迭代次数&#xff0c;也就是模型从纯噪声一步步“清晰化”图像的次数。你可以理解为模型在画这张图时“润色”的轮数。 Ⅱ步数的具体作…

【se-res模块学习】结合CIFAR-10分类任务学习

继CIFAR-10图像分类&#xff1a;【Res残差连接学习】结合CIFAR-10任务学习-CSDN博客 再优化 本次训练结果在测试集上的准确率表现可达到90%以上 1.训练模型&#xff08;MyModel.py&#xff09; import torch import torch.nn as nnclass SENet(nn.Module): # SE-Net模块def…

【C++设计模式之Template Method Pattern】

C设计模式之Template Method Pattern 模式定义核心思想动机(Motivation)结构&#xff08;Structure&#xff09;实现步骤应用场景要点总结 模式定义 模式定义&#xff1a; 定义一个操作中的算法的骨架(稳定)&#xff0c;而将一些步骤延迟(变化)到子类中。Template Method使得子…

英伟达Blackwell架构重构未来:AI算力革命背后的技术逻辑与产业变革

——从芯片暴力美学到分布式智能体网络&#xff0c;解析英伟达如何定义AI基础设施新范式 开篇&#xff1a;当算力成为“新石油”&#xff0c;英伟达的“炼油厂”如何升级&#xff1f; 2025年3月&#xff0c;英伟达GTC大会上&#xff0c;黄仁勋身披标志性皮衣&#xff0c;宣布了…

深度拆解!MES如何重构生产计划与排产调度全流程?

☂引言 在制造业数字化转型浪潮中&#xff0c;生产计划与排产调度的精准性直接决定企业竞争力。深蓝易网MES系统通过智能化调度与全流程管控&#xff0c;帮助企业破解排产难题&#xff0c;实现资源高效协同与生产透明化管理&#xff0c;为制造企业打造柔性化、敏捷化的生产体系…

信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十八)

个人笔记整理---仅供参考 第十八章项目绩效域 18.1干系人绩效域 18.2团队绩效域 18.3开发方法和生命周期绩效域 18.5项目工作绩效域 18.6交付绩效域 18.7度量绩效域 18.8不确定绩效域

UniDevTools - UniApp(前端app)调试工具使用

使用介绍 | UniDevTools 兼容框架&#xff1a; Vue2jsvuexVue3tsvuex(pinia)√√ 兼容平台&#xff1a; H5APP微信小程序APP-NVUE其他小程序UniAppX√√√√(大部分功能支持)未测试 (待办中) 下载安装 将下载好的源码解压至项目根目录&#xff0c;文件夹命名为 devTools …

spring中的@Lazy注解详解

一、核心功能与作用 Lazy 注解是 Spring 框架中用于延迟 Bean 初始化的核心工具&#xff0c;通过将 Bean 的创建推迟到首次使用时&#xff0c;优化资源利用和启动性能。其核心功能包括&#xff1a; 延迟初始化 默认情况下&#xff0c;Spring 在容器启动时立即初始化所有单例 …

视觉-语言-动作模型:概念、进展、应用与挑战(上)

25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步&#xff0c;旨在将感知、自然语言理解和具体动作统一在一个计…