性能优化
- 缓存策略
- 原理:通过在服务器端存储经常访问的数据,避免重复计算或查询数据库,从而加快响应速度。
- 关键代码修改:
- 使用
express - cache - response
中间件:
const express = require('express');
const cache = require('express - cache - response');
const app = express();
// 缓存响应,有效期60秒
app.get('/api/someData', cache({
statusCode: 200,
duration: 60
}), (req, res) => {
// 假设这里是获取数据的逻辑
res.json({ data: 'Some important data' });
});
- 异步操作优化
- 原理:Express 是基于 Node.js,本身是异步非阻塞的。但在处理复杂业务逻辑时,合理使用异步操作可避免阻塞事件循环,提高性能。例如使用
async/await
处理异步数据库查询等操作。
- 关键代码修改:
const express = require('express');
const mysql = require('mysql2');
const app = express();
const connection = mysql.createConnection({
host: 'localhost',
user: 'user',
password: 'password',
database: 'test'
});
app.get('/api/users', async (req, res) => {
try {
const [rows] = await connection.promise().query('SELECT * FROM users');
res.json(rows);
} catch (error) {
res.status(500).json({ error: 'Database query error' });
}
});
- 中间件合理使用
- 原理:中间件可以在请求到达路由之前或之后执行一些通用操作,如日志记录、请求体解析等。合理安排中间件顺序和使用必要的中间件可提高性能。例如,将
express.json()
放在路由之前解析 JSON 格式的请求体。
- 关键代码修改:
const express = require('express');
const app = express();
// 解析JSON格式的请求体
app.use(express.json());
// 定义路由
app.post('/api/data', (req, res) => {
const data = req.body;
res.json({ received: data });
});
安全加固
- 防止SQL注入
- 原理:SQL 注入是通过在输入中插入恶意 SQL 语句,从而执行非预期的数据库操作。使用参数化查询可以避免 SQL 注入,因为参数化查询会将输入作为数据处理,而不是 SQL 语句的一部分。
- 关键代码修改:
const express = require('express');
const mysql = require('mysql2');
const app = express();
const connection = mysql.createConnection({
host: 'localhost',
user: 'user',
password: 'password',
database: 'test'
});
app.get('/api/user/:id', (req, res) => {
const id = req.params.id;
connection.query('SELECT * FROM users WHERE id =?', [id], (error, results) => {
if (error) {
res.status(500).json({ error: 'Database query error' });
} else {
res.json(results);
}
});
});
- 防止XSS攻击
- 原理:XSS(跨站脚本攻击)是攻击者在网页中注入恶意脚本,当用户访问该网页时执行恶意脚本。对用户输入进行转义和过滤可以防止 XSS 攻击。
- 关键代码修改:
const express = require('express');
const xss = require('xss');
const app = express();
app.post('/api/comment', (req, res) => {
const comment = xss(req.body.comment);
// 假设这里将评论保存到数据库
res.json({ comment: 'Comment saved successfully' });
});
- 防止CSRF攻击
- 原理:CSRF(跨站请求伪造)是攻击者利用用户已登录的状态,在用户不知情的情况下,以用户的名义发送恶意请求。使用 CSRF 令牌可以防止此类攻击,用户每次请求时携带服务器生成的唯一令牌,服务器验证令牌的有效性。
- 关键代码修改:
const express = require('express');
const csrf = require('csurf');
const app = express();
const csrfProtection = csrf({ cookie: true });
// 获取CSRF令牌
app.get('/api/csrf - token', csrfProtection, (req, res) => {
res.json({ csrfToken: req.csrfToken() });
});
// 提交带有CSRF令牌的请求
app.post('/api/someAction', csrfProtection, (req, res) => {
res.json({ message: 'Action performed successfully' });
});