Express 核心概念
Express是基于Node.js的轻量级Web框架,封装了HTTP服务、路由管理、中间件等核心功能,简化了Web应用和API开发
核心优势
- 中间件架构:支持模块化请求处理流程
- 路由系统:直观的URL到处理函数的映射
- 高性能:非阻塞I/O模型与事件驱动机制
基础使用
- 安装express
js
npm init
npm i express
- 快速入门
js
// index.js
const express = require('express');
const port = 3000;
const app = express();
app.get('/a',(req,res)=>{
res.send("Welcome to a Page");
})
app.listen(port,()=>{
console.log("Server is running on port 3000");
})
//执行
// node index.js
// nodemon index.js
// npm run start //package.json中配置
- 浏览器访问
express 路由
路由确定了应用程序如何响应客户端对特定端点的请求
- 路由使用
js
const express = require('express');
const app = express();
// GET 路由
app.get('/home', (req, res) => {
res.send('网站首页');
});
// 根路由
app.get('/', (req, res) => {
res.send('首页');
});
// POST 路由
app.post('/login', (req, res) => {
res.send('登录成功');
});
// 路径参数(规范写法)
app.get('/users/:userId', (req, res) => {
res.send(`User ID: ${req.params.userId}`);
});
// 全方法路由
app.all('/search', (req, res) => {
res.send('1秒钟为您找到相关结果约100,000,000个');
});
// 多方法路由链
app.route('/books')
.get((req, res) => res.send('Get Books'))
.post((req, res) => res.send('Add Book'));
// 404 路由
app.all('*', (req, res) => {
res.send('<h1>404 Not Found</h1>');
});
app.listen(3000);

注意:
路由路径语法冲突app.all(':page(.)')中的 (.)被解析为正则表达式,但 path-to-regexp要求正则部分必须用 /包裹。当前写法 :page(.*)会被解析为:
- :page→ 命名参数
- (.*)→ 未闭合的正则片段(缺少起始 /),触发语法错误 Unexpected
获取请求参数
js
app.get('/request', (req, res) => {
// 获取报文的方式与原生 HTTP 获取方式是兼容的
console.log(req.method); // GET
console.log(req.url); // /request
console.log(req.httpVersion); // 1.1
console.log(req.headers); // 请求头
// / express 独有的获取报文的方式
console.log(req.query); // 查询字符串
console.log(req.get('host')); // 获取指定的请求头
res.send('请求报文的获取');
});
// 路径参数
app.get('/users/:userId', (req, res) => {
res.send(`User ID: ${req.params.userId}`);
});
express 响应设置
js
app.get("/response", (req, res) => {
// 原生HTTP方式
res.statusCode = 404;
res.statusMessage = 'Not Found';
res.setHeader('abc', 'xyz');
res.write('响应体');
res.end('结束');
// Express方式
res.status(500); // 状态码
res.set('xxx', 'yyy'); // 响应头
res.send('中文响应不乱码'); // 响应体
// 链式调用
res.status(404).set('xxx', 'yyy').send('你好朋友');
// 其他响应
res.redirect('http://example.com'); // 重定向
res.download('./package.json'); // 文件下载
res.json({name: 'John'}); // JSON响应
res.sendFile(__dirname + '/home.html'); // 发送文件
});
注意:出现乱码的情况
- 响应体中出现乱码
- 响应头中设置 Content-Type: text/plain; charset=utf-8
js
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8' // 明确指定 UTF-8
});
res.write('响应体');
res.end('结束');
express 中间件
中间件(Middleware)本质是一个回调函数,可以访问请求对象(request)和响应对象(response)
- 全局中间件
js
// 定义中间件
const logger = (req, res, next) => {
console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
next();
};
// 应用中间件
app.use(logger);
// 多个全局中间件
app.use((req, res, next) => {
console.log('中间件1');
next();
});
app.use((req, res, next) => {
console.log('中间件2');
next();
});
- 路由中间件
js
// 路由中间件(身份验证)
const authMiddleware = (req, res, next) => {
if (req.query.token === '123') next();
else res.status(401).send('Unauthorized');
};
const logMiddleware = (req, res, next) => {
console.log('日志记录');
next();
}
// 单个中间件
app.get('/admin', authMiddleware, (req, res) => {
res.send('管理员页面--');
});
// 多个中间件
app.get('/dashboard',
authMiddleware,
logMiddleware,
(req, res) => {
res.send('控制面板--');
}
);
- 静态资源中间件
js
// public目录作为静态资源根目录
app.use(express.static('./public'));
// 动态路由(注意顺序问题)
app.get('/index.html', (req, res) => {
res.send('动态首页');
});
- 关键内置中间件
js
// 解析请求体(JSON)
app.use(express.json());
// 解析请求体(表单数据)
app.use(express.urlencoded({ extended: true }));
// 解析Cookie
app.use(cookieParser());
// 解析Session(需要额外配置)
app.use(session({ secret: 'secret', resave: false, saveUninitialized: true }));
// 托管静态资源(public目录)
app.use(express.static('public'));
- 请求体解析中间件
js
npm i body-parser
const bodyParser = require('body-parser');
// 处理表单数据
app.use(bodyParser.urlencoded({ extended: false }));
// 处理JSON数据
app.use(bodyParser.json());
app.post('/login', (req, res) => {
console.log(req.body.username);
console.log(req.body.password);
res.send('登录成功');
});
Router 路由模块化
- 创建路由模块
js
//routes/userRouter.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('用户首页');
});
router.get('/list', (req, res) => {
res.send('用户列表');
});
router.get('/:id', (req, res) => {
res.send(`用户详情: ${req.params.id}`);
});
module.exports = router;
- 主文件使用路由
js
const express = require('express');
const app = express();
const userRouter = require('./routes/userRouter');
app.use('/users', userRouter);
app.listen(3000);
// 返回地址:
// http://localhost:3000/users/ -> 用户首页
// http://localhost:3000/users/list -> 用户列表
// http://localhost:3000/users/11 -> 用户详情: 11