Node.js的异步非阻塞特性与MySQL的成熟关系型数据库能力结合,既能处理高并发请求,又能保障数据一致性
本文将系统解析Node.js连接MySQL的核心技术,涵盖基础连接、错误处理、连接池优化及安全实践,助力开发者构建稳定可靠的数据库交互方案
一、基础连接:从零到一的突破 1.1 环境准备与模块安装 构建Node.js与MySQL交互环境需完成三步: 1.安装Node.js(建议LTS版本) 2.初始化项目:`npm init -y` 3.安装驱动模块:`npm install mysql2`(推荐使用mysql2替代原生mysql模块,支持Promise/async-await) 1.2基础连接代码实现 javascript const mysql = require(mysql2/promise); // 使用Promise版本 async function connectMySQL(){ try{ const connection = await mysql.createConnection({ host: localhost, user: root, password: your_password, database: test_db, waitForConnections: true, connectionLimit:10, queueLimit:0 }); console.log(数据库连接成功!线程ID:, connection.threadId); //执行查询示例 const【rows】 = await connection.query(SELECTFROM users); console.log(查询结果:, rows); await connection.end(); //关闭连接 } catch(err){ console.error(连接失败:, err.message); } } connectMySQL(); 1.3关键参数解析 |参数|说明|典型值| |---------------|-----------------------------|-----------------------| | host|数据库地址| localhost/IP| | user|用户名| root| | password|密码| your_password | | database|数据库名| test_db | | port|端口(默认3306)|3306| | charset |字符集| utf8mb4 | | connectTimeout |连接超时(毫秒)|10000 | 二、连接池:性能优化的核心武器 2.1连接池的必要性 在生产环境中,频繁创建/销毁连接会导致: -服务器资源浪费(每个连接约占用2MB内存) -响应延迟增加(连接建立耗时约2-5ms) -并发处理能力下降 2.2连接池实现方案 javascript const mysql = require(mysql2/promise); //创建连接池 const pool = mysql.createPool({ host: localhost, user: root, password: your_password, database: test_db, waitForConnections: true, connectionLimit:10, //最大连接数 queueLimit:0 //队列无限制 }); // 使用连接池执行查询 async function queryWithPool(){ try{ const【rows】 = await pool.query(SELECTFROM users); console.log(查询结果:, rows); } catch(err){ console.error(查询失败:, err.message); } } queryWithPool(); 2.3连接池参数调优指南 |参数 |说明|推荐值| |--------------------|-----------------------------|-----------------------| | connectionLimit|最大连接数| CPU核心数×2 | | queueLimit |等待队列长度|0(无限等待)或合理值| | acquireTimeout | 获取连接超时(毫秒)|10000 | | waitForConnections |队列满时是否等待| true(生产环境) | 三、错误处理:构建健壮系统 3.1常见错误类型及解决方案 |错误类型 |原因|解决方案| |------------------------|-----------------------------|---------------------------------| |`ECONNREFUSED` |数据库服务未启动| 检查MySQL服务状态,确认端口正确| |`ER_ACCESS_DENIED` |用户名/密码错误|验证凭证,检查权限配置| |`ER_BAD_DB_ERROR`|数据库不存在|确认数据库已创建,检查大小写敏感| |`ER_PARSE_ERROR` | SQL语法错误| 使用SQL验证工具检查语法| |`ER_LOCK_WAIT_TIMEOUT` |查询超时|优化SQL,添加索引,调整超时时间| 3.2 重连机制实现 javascript async function reconnectableQuery(){ let retryCount =0; const maxRetries =3; while(retryCount < maxRetries){ try{ const【rows】 = await pool.query(SELECTFROM users); return rows; } catch(err){ retryCount++; console.warn(`查询失败,重试次数:${retryCount}`); if(retryCount >= maxRetries){ throw new Error(最大重试次数已达); } await new Promise(resolve => setTimeout(resolve,2000)); //延迟2秒重试 } } } 四、安全实践:守护数据防线 4.1 SQL注入防护 javascript //错误示例:直接拼接SQL(易受注入攻击) const username = admin; const sql =`SELECT - FROM users WHERE username = ${username}`; //正确示例:使用参数化查询 const【users】 = await pool.query( SELECT - FROM users WHERE username = ?, 【username】 //参数化查询 ); 4.2敏感信息管理 1. 使用环境变量存储凭证: javascript require(dotenv).config(); const pool = mysql.createPool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME }); 2.创建`.env`文件: DB_HOST=localhost DB_USER=root DB_PASSWORD=secure_password DB_NAME=test_db 4.3连接池安全配置 javascript const pool = mysql.createPool({ // ...其他参数 ssl:{ rejectUnauthorized: true //强制SSL连接 }, timezone: +08: