2.Express 核心语法与路由

核心目标

掌握 Express 路由、请求 / 响应处理、中间件(核心概念)

路由进阶(GET/POST 请求)

get

复制代码
var express = require('express');
var router = express.Router();

// GET 请求:获取用户列表
router.get('/list', (req, res) => {
  res.json({
    code: 200,
    msg: '获取用户列表成功',
    data: [
      { id: 1, name: '张三' },
      { id: 2, name: '李四' }
    ]
  });
});

module.exports = router;

app.js 中注册路由:

复制代码
var userRouter = require('./routes/user');
app.use('/api/user', userRouter); // 接口前缀 /api/user

处理 POST 请求

  • 安装解析 POST 请求的中间件:npm install body-parser;处理前端json传参。
  • 在 app.js 中引入并配置
复制代码
  var bodyParser = require('body-parser');
  // 解析 JSON 格式的请求体(前端 Axios 默认提交格式)
  app.use(bodyParser.json());
  // 解析表单格式的请求体
  app.use(bodyParser.urlencoded({ extended: false }));

  // POST 请求:新增用户
  router.post('/add', (req, res) => {
    // 获取前端传递的参数(req.body 类比前端的请求体)
    const { name, age } = req.body;
    res.json({
      code: 200,
      msg: `新增用户 ${name} 成功`,
      data: { id: 3, name, age }
    });
  });

中间件(核心)

Express 中间件是框架的 "灵魂",本质是可链式执行的函数,用于拦截和处理 HTTP 请求 - 响应周期的任意环节。它既可以完成通用逻辑(如跨域、日志、请求体解析),也能实现业务逻辑(如权限校验、数据预处理),是 Express 实现灵活扩展的核心机制。

一:基础必备中间件(90% 项目必用)

|----------------------|-----|--------------------------------|-------------------------------------------------------------------------------------------|
| 中间件 / 能力 | 类型 | 核心作用 | 极简用法 |
| express.json() | 内置 | 解析 JSON 格式请求体(替代 body-parser) | app.use(express.json()); |
| express.urlencoded() | 内置 | 解析表单(x-www-form-urlencoded)请求体 | app.use(express.urlencoded({ extended: true })); |
| express.static() | 内置 | 托管静态文件(CSS/JS/ 图片 / HTML) | app.use(express.static('public')); // 或加虚拟前缀:app.use('/static', express.static('public')) |
| cors | 第三方 | 便捷处理跨域(替代手动写跨域头) | npm i cors → const cors = require('cors'); app.use(cors()); |
| morgan | 第三方 | 记录 HTTP 请求日志(开发 / 生产环境适配) | npm i morgan → const morgan = require('morgan'); app.use(morgan('dev')); |

  • express.json()/urlencoded() 替代了老版本的 body-parser,无需额外安装;

  • cors 支持精细化配置(如仅允许指定域名):

    app.use(cors({ origin: 'https://your-domain.com' })); // 仅允许该域名跨域

  • morgan 的日志格式:dev(开发环境,简洁)、combined(生产环境,符合 Apache 标准)。

二、身份认证 / 权限中间件(业务核心)

解决 "登录校验、权限控制" 等核心业务需求,是前后端分离项目的必备。

|-----------------|-----|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 中间件 | 类型 | 核心作用 | 极简用法 |
| express-jwt | 第三方 | 解析 JWT Token,实现无状态身份认证 | npm i express-jwt jsonwebtoken →const jwt = require('express-jwt');app.use(jwt({ secret: 'your-secret', algorithms: ['HS256'] }).unless({ path: ['/api/login'] })); |
| passport | 第三方 | 多策略认证(用户名密码 / 微信 / Google 等) | npm i passport passport-local → 配合策略配置实现多方式登录 |
| express-session | 第三方 | 基于 session 的身份认证(有状态) | npm i express-session →app.use(session({ secret: 'key', resave: false, saveUninitialized: true })); |

关键补充

  • express-jwtunless() 用于指定 "无需校验的路径"(如登录接口);
  • express-session 需配合 cookie-parser 使用(存储 sessionID),适合传统服务端渲染项目;
  • 生产环境中 express-jwt 的 secret 需用环境变量存储(避免硬编码)。
三、安全加固中间件(生产环境必备)

提升项目的安全性,防御常见的 Web 攻击(如 XSS、CSRF、HTTP 头漏洞)。

|---------------|-----|---------------------------------|----------------------------------------------------------------------------------------------------------------------|
| 中间件 | 类型 | 核心作用 | 极简用法 |
| helmet | 第三方 | 自动设置安全 HTTP 头(防 XSS / 点击劫持等) | npm i helmet → const helmet = require('helmet'); app.use(helmet()); |
| csurf | 第三方 | 防御 CSRF 攻击(生成 / 验证 CSRF Token) | npm i csurf → 配合 session/cookie 实现 CSRF 校验 |
| rate-limit | 第三方 | 接口限流(防暴力请求 / DDOS) | npm i express-rate-limit →const limiter = rateLimit({ windowMs: 15*60*1000, max: 100 });app.use('/api/', limiter); |
| cookie-parser | 第三方 | 解析 Cookie 数据(配合 session/jwt 使用) | npm i cookie-parser → const cookieParser = require('cookie-parser'); app.use(cookieParser()); |

关键补充

  • helmet 是 "安全头合集",默认开启 10+ 种安全防护(如 Content-Security-Policy、X-XSS-Protection);
  • rate-limitwindowMs 是时间窗口(如 15 分钟),max 是窗口内最大请求数(如 100 次)。
四、开发效率 / 调试中间件(开发环境专用)

提升开发效率,减少重复工作(如热重载、接口文档、错误美化)。

|---------------------------|------|-------------------|--------------------------------------------------------------------------|
| 中间件 | 类型 | 核心作用 | 极简用法 |
| nodemon | 开发依赖 | 代码热重载(修改后自动重启服务) | npm i nodemon -D → package.json 加脚本:"dev": "nodemon app.js" |
| express-swagger-generator | 第三方 | 自动生成 Swagger 接口文档 | npm i express-swagger-generator → 配置后自动生成 /api-docs 文档页面 |
| debug | 第三方 | 精细化日志调试(按模块开关日志) | npm i debug → const debug = require('debug')('app:main'); debug('启动服务'); |
| express-error-handler | 第三方 | 美化错误页面(开发环境) | npm i express-error-handler → 替代原生错误中间件,返回可视化错误栈 |

关键补充

  • nodemon 仅用于开发环境,生产环境用 node app.js 启动;
  • debug 可通过环境变量 DEBUG=app:* 控制日志输出(如 DEBUG=app:router 仅打印路由模块日志)。
五、文件处理 / 数据处理中间件

解决 "文件上传、数据验证、数据格式化" 等业务场景需求

|-----------------------|-----|--------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 中间件 | 类型 | 核心作用 | 极简用法 |
| multer | 第三方 | 处理文件上传(multipart/form-data 格式) | npm i multer →const multer = require('multer');const upload = multer({ dest: 'uploads/' });app.post('/upload', upload.single('file'), (req, res) => {}); |
| joi/express-validator | 第三方 | 接口参数校验(防非法数据) | npm i express-validator → 路由中校验 req.body/req.query 字段 |
| compression | 第三方 | 响应数据压缩(gzip),提升传输速度 | npm i compression → const compression = require('compression'); app.use(compression()); |

关键补充

  • multer 是唯一能处理 multipart/form-data 的中间件(body-parser 不支持);
  • express-validator 支持链式校验(如 check('username').notEmpty().isLength({ min: 6 }));
  • compression 自动压缩响应体(如 JSON/HTML),可减少 70% 传输体积。
六、自定义通用中间件(高频自定义场景)

除了第三方中间件,以下自定义中间件也是项目中高频用到的,可直接复用:

|---------|-------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| 自定义中间件 | 核心作用 | 核心代码片段 |
| 统一响应格式 | 规范接口返回格式(如 {code, msg, data}) | app.use((req, res, next) => { res.success = (data) => res.json({ code:200, msg:'成功', data }); next(); }); |
| 接口耗时统计 | 记录每个接口的响应耗时(性能分析) | app.use((req, res, next) => { const start = Date.now(); res.on('finish', () => console.log({Date.now()-start}ms)); next(); }); |
| 接口白名单校验 | 仅允许指定 IP / 域名访问接口 | app.use((req, res, next) => { const whiteList = ['127.0.0.1']; if (!whiteList.includes(req.ip)) return res.status(403).send('禁止访问'); next(); }); |

相关推荐
程序员爱钓鱼3 小时前
Node.js 编程实战:WebSocket实时通信详解
后端·node.js·trae
醉风塘3 小时前
NPM:从“模块之痛”到“生态之基”的演化史
前端·npm·node.js
程序员爱钓鱼3 小时前
Node.js 编程实战:Cookie与Session深度解析
后端·node.js·trae
GDAL3 小时前
Node.js `import.meta` 深入全面讲解
node.js
先生沉默先3 小时前
Docker+Nginx+Node.js 全栈容器化部署
nginx·docker·node.js
水冗水孚3 小时前
通俗易懂地谈谈,前端工程化之自定义脚手架的理解,并附上一个实践案例发布到npm上
javascript·npm·node.js
feathered-feathered3 小时前
Redis【事务】(面试相关)与MySQL相比较,重点在Redis事务
android·java·redis·后端·mysql·中间件·面试
蚂蚁不吃土&4 小时前
cmd powershell svm nodejs npm
前端·npm·node.js
毕设源码-郭学长4 小时前
【开题答辩全过程】以 基于Node.js的医院预约挂号系统为例,包含答辩的问题和答案
node.js