MST

星途 面试题库

面试题:Node.js HTTP请求响应性能优化与安全

在高并发场景下,Node.js的HTTP服务器如何优化请求响应性能?从缓存策略、连接管理等方面阐述。同时,针对常见的HTTP安全漏洞(如SQL注入、XSS等),在Node.js处理HTTP请求响应过程中有哪些有效的防范措施?
50.3万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

高并发场景下Node.js HTTP服务器优化请求响应性能

  1. 缓存策略
    • 内存缓存:使用如 node-cache 这样的库,在内存中存储频繁访问的数据。例如,对于一些不经常变化的配置信息、基础数据等,可在首次请求时查询数据库或其他数据源,将结果存入内存缓存,后续相同请求直接从缓存获取,减少数据库或其他IO操作。
    • HTTP缓存:合理设置HTTP缓存头,如 Cache - ControlETag。对于静态资源(如CSS、JS、图片等),设置较长的缓存过期时间,告知浏览器直接从本地缓存加载,减少服务器负载。对于动态数据,可根据业务逻辑设置合适的缓存策略,如根据数据的更新频率设置较短的缓存时间。
  2. 连接管理
    • 连接池:对于数据库连接或其他外部服务连接,使用连接池技术。例如,在连接MySQL数据库时,通过 mysql2 库的连接池功能,创建一定数量的连接对象并复用。在高并发场景下,避免频繁创建和销毁连接带来的性能开销,提高连接的使用效率。
    • Keep - Alive:启用HTTP Keep - Alive功能,默认情况下Node.js的HTTP服务器是支持Keep - Alive的。它允许在同一个TCP连接上进行多个HTTP请求和响应,减少了建立和关闭TCP连接的开销,提高了请求处理效率。可以通过设置 http.ServerkeepAliveTimeoutheadersTimeout 等属性来优化Keep - Alive行为。
    • 负载均衡:采用负载均衡技术,如使用Nginx作为反向代理服务器,将请求均匀分配到多个Node.js实例上。这样可以充分利用多台服务器的资源,提高整体的处理能力和并发性能。

防范常见HTTP安全漏洞

  1. SQL注入防范
    • 参数化查询:使用数据库驱动提供的参数化查询功能。例如,在使用 mysql2 库操作MySQL数据库时,不要直接拼接SQL语句,而是使用占位符。如下代码示例:
const mysql = require('mysql2');
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'test'
});
const username = req.body.username;
const query = 'SELECT * FROM users WHERE username =?';
connection.query(query, [username], (err, results) => {
    if (err) throw err;
    console.log(results);
});
- **输入验证**:对用户输入的数据进行严格的验证和过滤。使用正则表达式或专门的验证库(如 `joi`)来验证输入的数据格式是否符合预期。例如,验证邮箱格式:
const Joi = require('joi');
const schema = Joi.string().email();
const { error } = schema.validate(req.body.email);
if (error) {
    // 返回错误信息
    res.status(400).send('Invalid email');
}
  1. XSS防范
    • 输出编码:对输出到前端的数据进行编码。例如,在使用模板引擎(如EJS)时,引擎会自动对输出的数据进行HTML转义,防止恶意脚本注入。如果是手动拼接HTML,要使用 DOMPurify 这样的库对数据进行净化。示例如下:
const DOMPurify = require('dompurify');
const dirty = '<script>alert("XSS")</script>';
const clean = DOMPurify.sanitize(dirty);
res.send(clean);
- **内容安全策略(CSP)**:设置HTTP的 `Content - Security - Policy` 头,限制页面可以加载的资源来源。例如,只允许从特定的域名加载脚本、样式等资源,防止恶意脚本的注入。在Node.js中,可以在响应头中设置:
res.setHeader('Content - Security - Policy', "default - src'self'");