MST
星途 面试题库

面试题:Node.js中Express构建RESTful API接口之性能优化与安全加固

现有一个使用Express构建的复杂RESTful API服务,面临性能瓶颈和安全风险。请从性能优化(如缓存策略、异步操作优化、中间件合理使用等)和安全加固(如防止SQL注入、XSS攻击、CSRF攻击等)两个方面详细阐述你的优化方案,并给出关键代码修改建议和原理说明。
45.8万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

性能优化

  1. 缓存策略
    • 原理:通过在服务器端存储经常访问的数据,避免重复计算或查询数据库,从而加快响应速度。
    • 关键代码修改
      • 使用 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' });
});
  1. 异步操作优化
    • 原理: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' });
    }
});
  1. 中间件合理使用
    • 原理:中间件可以在请求到达路由之前或之后执行一些通用操作,如日志记录、请求体解析等。合理安排中间件顺序和使用必要的中间件可提高性能。例如,将 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 });
});

安全加固

  1. 防止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);
        }
    });
});
  1. 防止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' });
});
  1. 防止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' });
});