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

Express.js 框架教程:从入门到精通

一、Express.js 简介

Express.js 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供了一系列强大的特性来帮助创建各种 Web 和移动设备应用。

1.1 Express 的特点

  • 轻量级且灵活
  • 中间件架构
  • 路由系统强大
  • 支持多种模板引擎
  • 易于集成数据库

1.2 为什么选择 Express

  • Node.js 最流行的 web 框架
  • 学习曲线平缓
  • 庞大的社区支持
  • 适合构建 RESTful API

二、环境搭建与基本应用

2.1 安装 Express

# 创建项目目录并初始化
mkdir my-express-app
cd my-express-app
npm init -y# 安装 Express
npm install express

2.2 创建第一个 Express 应用

const express = require('express');
const app = express();
const port = 3000;app.get('/', (req, res) => {res.send('Hello World!');
});app.listen(port, () => {console.log(`Example app listening at http://localhost:${port}`);
});

2.3 运行应用

node app.js

三、核心概念

3.1 路由处理

Express 提供了简单直观的路由定义方式:

// 基本路由
app.get('/', (req, res) => {res.send('GET request to homepage');
});app.post('/', (req, res) => {res.send('POST request to homepage');
});// 路径参数
app.get('/users/:userId', (req, res) => {res.send(`User ID: ${req.params.userId}`);
});// 路由链
app.route('/book').get((req, res) => {res.send('Get a random book');}).post((req, res) => {res.send('Add a book');});

3.2 中间件

中间件是 Express 的核心概念,可以访问请求对象(req)、响应对象(res)和应用程序的请求-响应循环中的下一个中间件函数。

// 应用级中间件
app.use((req, res, next) => {console.log('Time:', Date.now());next();
});// 路由级中间件
app.use('/user/:id', (req, res, next) => {console.log('Request Type:', req.method);next();
});// 错误处理中间件
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('Something broke!');
});

3.3 静态文件服务

app.use(express.static('public'));

四、高级特性

4.1 模板引擎集成

Express 支持多种模板引擎,如 Pug、EJS、Handlebars 等。

// 设置 EJS 为模板引擎
app.set('view engine', 'ejs');// 渲染视图
app.get('/', (req, res) => {res.render('index', { title: 'Express App', message: 'Hello there!' });
});

4.2 RESTful API 开发

// 获取资源列表
app.get('/api/users', (req, res) => {res.json([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]);
});// 获取单个资源
app.get('/api/users/:id', (req, res) => {res.json({ id: req.params.id, name: 'John Doe' });
});// 创建资源
app.post('/api/users', express.json(), (req, res) => {// req.body 包含请求体res.status(201).json({ id: 3, ...req.body });
});// 更新资源
app.put('/api/users/:id', express.json(), (req, res) => {res.json({ id: req.params.id, ...req.body });
});// 删除资源
app.delete('/api/users/:id', (req, res) => {res.status(204).end();
});

4.3 错误处理

// 同步错误处理
app.get('/error', (req, res) => {throw new Error('BROKEN'); // Express 将捕获此错误
});// 异步错误处理
app.get('/async-error', (req, res, next) => {fs.readFile('/file-does-not-exist', (err, data) => {if (err) {next(err); // 将错误传递给 Express} else {res.send(data);}});
});

五、项目结构与最佳实践

5.1 推荐的项目结构

my-express-app/
├── node_modules/
├── config/
│   └── config.js
├── controllers/
│   └── userController.js
├── models/
│   └── userModel.js
├── routes/
│   └── userRoutes.js
├── public/
│   ├── css/
│   ├── js/
│   └── images/
├── views/
│   └── index.ejs
├── app.js
└── package.json

5.2 路由分离示例

// routes/userRoutes.js
const express = require('express');
const router = express.Router();router.get('/', (req, res) => {res.send('User list');
});router.get('/:id', (req, res) => {res.send(`User ID: ${req.params.id}`);
});module.exports = router;// app.js
const userRoutes = require('./routes/userRoutes');
app.use('/users', userRoutes);

5.3 环境变量管理

使用 dotenv 管理环境变量:

npm install dotenv

创建 .env 文件:

PORT=3000
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3

在应用中加载:

require('dotenv').config();const port = process.env.PORT || 3000;
// ...

六、部署与性能优化

6.1 生产环境部署

  • 使用 NODE_ENV=production 环境变量
  • 使用进程管理器(如 PM2)
  • 启用 Gzip 压缩
  • 设置正确的安全头

6.2 性能优化技巧

// 启用压缩
const compression = require('compression');
app.use(compression());// 启用缓存
const apicache = require('apicache');
const cache = apicache.middleware;
app.get('/api/expensive-route', cache('5 minutes'), (req, res) => {// 昂贵的操作
});// 集群模式
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;if (cluster.isMaster) {for (let i = 0; i < numCPUs; i++) {cluster.fork();}
} else {// 启动 Express 应用
}

七、常见扩展与插件

7.1 常用中间件

  • body-parser: 解析请求体
  • cookie-parser: 解析 cookie
  • morgan: HTTP 请求日志记录
  • helmet: 安全相关 HTTP 头设置
  • cors: 跨域资源共享支持

7.2 数据库集成

// MongoDB (Mongoose)
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/myapp');// MySQL
const mysql = require('mysql2');
const connection = mysql.createConnection({host: 'localhost',user: 'root',database: 'test'
});

八、实战项目:构建一个博客系统

8.1 项目需求

  • 用户认证
  • 文章发布
  • 评论功能
  • 分类管理

8.2 核心代码示例

// 用户认证路由
const passport = require('passport');app.post('/login', passport.authenticate('local', { successRedirect: '/',failureRedirect: '/login',failureFlash: true })
);// 文章路由
app.get('/posts', postController.getAllPosts);
app.post('/posts', authMiddleware, postController.createPost);
app.get('/posts/:id', postController.getPost);
app.put('/posts/:id', authMiddleware, postController.updatePost);
app.delete('/posts/:id', authMiddleware, postController.deletePost);

九、学习资源与进阶方向

9.1 推荐学习资源

  • Express 官方文档
  • Express 中文文档
  • 《Node.js 实战》
  • 《Express in Action》

9.2 进阶方向

  • 深入中间件开发
  • 微服务架构
  • GraphQL API 开发
  • Serverless 部署
  • 性能监控与调优
http://www.xdnf.cn/news/2707.html

相关文章:

  • 【“星瑞” O6 评测】 — llm CPU部署对比高通骁龙CPU
  • T-BOX应用 NXP S32K148控芯片搭配 SD NAND(嵌入式SD卡)存储的完美结合
  • 设计模式(状态模式)
  • 【力扣刷题实战】丢失的数字
  • vue代码规范管理
  • BeeWorks企业内部即时通讯软件支持国产化,已在鸿蒙系统上稳定运行
  • 【Altium】自定义菜单显示名称
  • C++23 std::bind_back:一种调用包装器 (P2387R3)
  • Matlab自学笔记五十二:变量名称:检查变量名称是否存在或是否与关键字冲突
  • Nacos-3.0.0适配PostgreSQL数据库
  • 互容是什么意思?
  • python+selenium实现淘宝商品数据半自动查询
  • pg数据库删除模式
  • CVE-2024-3431 EyouCMS 反序列化漏洞研究分析
  • 道可云人工智能每日资讯|“人工智能科技体验展”在中国科学技术馆举行
  • 【原创】从s3桶将对象导入ES建立索引,以便快速查找文件
  • 基于 MeloTTS.cpp 的轻量级的纯 C++ 文本转语音(TTS)库
  • 相机-IMU联合标定:相机-IMU外参标定
  • 【二分查找】寻找峰值(medium)
  • 学生管理系统审计
  • 从零开始的二三维CAD软件开发: 系列经验分享-写在开头
  • TensorFlow深度学习实战——基于循环神经网络的文本生成模型
  • ExoPlayer 中的 Timeline、Period 和 Window
  • shell--数组、正则表达式RE
  • Flutter 学习之旅 之 flutter 作为 module ,在 Android 端主动唤起 Flutter 开发的界面 简单的整理
  • gitgitgit!
  • 关于CentOS7学习过程中遇到的一些问题
  • JAVA-StringBuilder使用方法
  • 文号验证-同时对两个输入框验证
  • Android开发,实现一个简约又好看的登录页