Appearance
Express框架
Express是Node.js最流行的Web应用框架,提供了一套简洁而强大的功能来开发Web应用和API。
Express简介
Express是一个快速、不显眼、功能丰富的Node.js Web应用框架。它提供了一系列强大的特性来开发Web和移动应用。
安装Express
bash
# 初始化项目
npm init -y
# 安装Express
npm install express
# 安装类型定义(可选)
npm install --save-dev @types/express
基础Hello World应用
javascript
const express = require('express');
const app = express();
const port = 3000;
// 基础路由
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`应用运行在 http://localhost:${port}`);
});
路由系统
基础路由
javascript
const express = require('express');
const app = express();
// GET请求
app.get('/', (req, res) => {
res.send('GET请求到根路径');
});
// POST请求
app.post('/users', (req, res) => {
res.send('POST请求到/users');
});
// PUT请求
app.put('/users/:id', (req, res) => {
res.send(`PUT请求到/users/${req.params.id}`);
});
// DELETE请求
app.delete('/users/:id', (req, res) => {
res.send(`DELETE请求到/users/${req.params.id}`);
});
// 响应多种HTTP方法
app.all('/secret', (req, res, next) => {
console.log('访问了保密路径');
next(); // 将控制权传递给下一个匹配的路由
});
路由参数
javascript
const express = require('express');
const app = express();
// 路由参数
app.get('/users/:userId/books/:bookId', (req, res) => {
res.json({
userId: req.params.userId,
bookId: req.params.bookId
});
});
// 可选参数
app.get('/users/:userId?', (req, res) => {
if (req.params.userId) {
res.json({ user: req.params.userId });
} else {
res.json({ message: '未指定用户' });
}
});
// 查询参数
app.get('/search', (req, res) => {
const { q, page = 1, limit = 10 } = req.query;
res.json({
query: q,
page: parseInt(page),
limit: parseInt(limit)
});
});
// 正则表达式路由
app.get(/.*fly$/, (req, res) => {
res.send('/.*fly$/ 匹配');
});
中间件
应用级中间件
javascript
const express = require('express');
const app = express();
// 使用内置中间件
app.use(express.json()); // 解析JSON请求体
app.use(express.urlencoded({ extended: true })); // 解析URL编码的请求体
// 自定义中间件
app.use((req, res, next) => {
console.log(`${req.method} ${req.url} - ${new Date().toISOString()}`);
next();
});
// 路径特定的中间件
app.use('/api', (req, res, next) => {
console.log('API请求');
next();
});
// 错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('服务器错误');
});
路由级中间件
javascript
const express = require('express');
const app = express();
const router = express.Router();
// 路由级中间件
router.use((req, res, next) => {
console.log('路由中间件');
next();
});
router.get('/', (req, res) => {
res.send('路由主页');
});
app.use('/admin', router);
第三方中间件
javascript
const express = require('express');
const app = express();
// 安装: npm install cors helmet morgan
const cors = require('cors');
const helmet = require('helmet');
const logger = require('morgan');
// 安全中间件
app.use(helmet());
// CORS中间件
app.use(cors());
// 日志中间件
app.use(logger('dev'));
请求和响应对象
请求对象(req)
javascript
app.get('/user-info', (req, res) => {
res.json({
// 基本信息
method: req.method,
url: req.url,
originalUrl: req.originalUrl,
baseUrl: req.baseUrl,
// 参数
params: req.params,
query: req.query,
body: req.body, // 需要中间件解析
// 头部信息
headers: req.headers,
ip: req.ip,
hostname: req.hostname,
// 协议和安全
protocol: req.protocol,
secure: req.secure,
xhr: req.xhr, // 是否为AJAX请求
// 路径信息
path: req.path
});
});
响应对象(res)
javascript
app.get('/response-examples', (req, res) => {
// 发送不同类型的响应
res.status(200).send('文本响应');
// JSON响应
res.json({ message: 'JSON响应' });
// 渲染模板(需要配置模板引擎)
// res.render('index', { title: '标题' });
// 重定向
// res.redirect('/new-location');
// 下载文件
// res.download('/path/to/file');
// 发送文件
// res.sendFile('/path/to/file');
// 设置头部
res.set('Content-Type', 'text/plain');
res.set({
'X-Custom-Header': 'value',
'Cache-Control': 'no-cache'
});
// Cookie操作
res.cookie('name', 'value', { maxAge: 900000, httpOnly: true });
res.clearCookie('name');
// 结束响应
res.end();
});
静态文件服务
javascript
const express = require('express');
const app = express();
// 服务静态文件
app.use(express.static('public'));
// 使用自定义路径前缀
app.use('/static', express.static('public'));
// 设置最大缓存时间
app.use('/static', express.static('public', {
maxAge: '1d', // 1天
etag: false // 禁用ETag
}));
// 多个静态目录
app.use('/images', express.static('public/images'));
app.use('/css', express.static('public/css'));
app.use('/js', express.static('public/js'));
模板引擎
使用Pug模板引擎
bash
npm install pug
javascript
const express = require('express');
const app = express();
// 设置模板引擎
app.set('view engine', 'pug');
app.set('views', './views');
app.get('/', (req, res) => {
res.render('index', {
title: 'Express模板示例',
message: 'Hello Pug!'
});
});
使用EJS模板引擎
bash
npm install ejs
javascript
const express = require('express');
const app = express();
// 设置模板引擎
app.set('view engine', 'ejs');
app.set('views', './views');
app.get('/', (req, res) => {
res.render('index', {
title: 'Express模板示例',
message: 'Hello EJS!'
});
});
RESTful API开发
用户管理API
javascript
const express = require('express');
const app = express();
app.use(express.json());
// 模拟数据库
let users = [
{ id: 1, name: '张三', email: 'zhang@example.com' },
{ id: 2, name: '李四', email: 'li@example.com' }
];
// 获取所有用户
app.get('/api/users', (req, res) => {
const { page = 1, limit = 10 } = req.query;
const startIndex = (page - 1) * limit;
const endIndex = page * limit;
res.json({
users: users.slice(startIndex, endIndex),
pagination: {
page: parseInt(page),
limit: parseInt(limit),
total: users.length
}
});
});
// 获取特定用户
app.get('/api/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) {
return res.status(404).json({ error: '用户不存在' });
}
res.json(user);
});
// 创建用户
app.post('/api/users', (req, res) => {
const { name, email } = req.body;
if (!name || !email) {
return res.status(400).json({ error: '姓名和邮箱是必需的' });
}
const newUser = {
id: users.length > 0 ? Math.max(...users.map(u => u.id)) + 1 : 1,
name,
email
};
users.push(newUser);
res.status(201).json(newUser);
});
// 更新用户
app.put('/api/users/:id', (req, res) => {
const userId = parseInt(req.params.id);
const userIndex = users.findIndex(u => u.id === userId);
if (userIndex === -1) {
return res.status(404).json({ error: '用户不存在' });
}
const { name, email } = req.body;
users[userIndex] = { ...users[userIndex], name, email };
res.json(users[userIndex]);
});
// 删除用户
app.delete('/api/users/:id', (req, res) => {
const userId = parseInt(req.params.id);
const userIndex = users.findIndex(u => u.id === userId);
if (userIndex === -1) {
return res.status(404).json({ error: '用户不存在' });
}
users.splice(userIndex, 1);
res.status(204).send();
});
错误处理
全局错误处理
javascript
const express = require('express');
const app = express();
// 自定义错误类
class AppError extends Error {
constructor(message, statusCode) {
super(message);
this.statusCode = statusCode;
this.status = statusCode >= 400 && statusCode < 500 ? 'fail' : 'error';
this.isOperational = true;
Error.captureStackTrace(this, this.constructor);
}
}
// 业务逻辑中间件
const getUserById = (req, res, next) => {
const userId = parseInt(req.params.id);
if (isNaN(userId)) {
return next(new AppError('无效的用户ID', 400));
}
const user = users.find(u => u.id === userId);
if (!user) {
return next(new AppError('用户不存在', 404));
}
req.user = user;
next();
};
// 使用错误处理中间件
app.get('/api/users/:id', getUserById, (req, res) => {
res.json(req.user);
});
// 全局错误处理中间件
app.use((err, req, res, next) => {
err.statusCode = err.statusCode || 500;
err.status = err.status || 'error';
if (process.env.NODE_ENV === 'development') {
res.status(err.statusCode).json({
status: err.status,
error: err,
message: err.message,
stack: err.stack
});
} else {
if (err.isOperational) {
res.status(err.statusCode).json({
status: err.status,
message: err.message
});
} else {
console.error('ERROR: ', err);
res.status(500).json({
status: 'error',
message: '服务器内部错误'
});
}
}
});
高级特性
中间件链和next()
javascript
// 中间件链示例
const validateUser = (req, res, next) => {
if (!req.body.name) {
return res.status(400).json({ error: '用户名是必需的' });
}
next();
};
const checkPermission = (req, res, next) => {
// 模拟权限检查
const hasPermission = true; // 实际应用中会检查用户权限
if (!hasPermission) {
return res.status(403).json({ error: '权限不足' });
}
next();
};
app.post('/api/users', validateUser, checkPermission, (req, res) => {
res.json({ message: '用户创建成功' });
});
路由模块化
javascript
// routes/users.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.json({ message: '获取所有用户' });
});
router.get('/:id', (req, res) => {
res.json({ message: `获取用户 ${req.params.id}` });
});
router.post('/', (req, res) => {
res.json({ message: '创建新用户' });
});
module.exports = router;
// app.js
const userRoutes = require('./routes/users');
app.use('/api/users', userRoutes);
Express应用生成器
bash
# 安装Express生成器
npm install -g express-generator
# 创建应用骨架
express myapp --view=ejs
# 安装依赖
cd myapp
npm install
生产环境配置
环境变量配置
javascript
const express = require('express');
const app = express();
// 根据环境配置
const PORT = process.env.PORT || 3000;
const NODE_ENV = process.env.NODE_ENV || 'development';
if (NODE_ENV === 'production') {
// 生产环境配置
app.set('trust proxy', 1); // 信任第一层代理
app.use(logger('combined')); // 详细的日志格式
} else {
// 开发环境配置
app.use(logger('dev'));
}
app.listen(PORT, () => {
console.log(`服务器运行在端口 ${PORT}, 环境: ${NODE_ENV}`);
});
Express框架简化了Node.js Web应用的开发,提供了路由、中间件、模板引擎等强大功能,是构建现代Web应用的首选框架之一。