Node.js 连接 MySQL(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在现代 Web 开发中,Node.js 与 MySQL 的组合是构建后端服务的常见技术栈。Node.js 凭借其异步非阻塞的特性,能够高效处理高并发请求;而 MySQL 作为关系型数据库的代表,提供了稳定可靠的结构化数据存储能力。本文将深入探讨如何通过 Node.js 连接 MySQL 数据库,从环境搭建到高级优化技巧,帮助开发者快速掌握这一核心技能。
环境准备与依赖安装
开发环境配置
在开始之前,需要确保本地已安装以下工具:
- Node.js:访问 Node.js 官网 下载对应操作系统的安装包。
- MySQL:根据操作系统选择安装方式,例如在 Ubuntu 上可通过
sudo apt-get install mysql-server
安装。 - MySQL Workbench(可选):用于可视化管理数据库的图形化工具。
安装数据库驱动
Node.js 本身不直接支持 MySQL,需通过第三方驱动库实现连接。以下是常用的驱动库及其特点:
库名 | 特点 |
---|---|
mysql | 经典的轻量级驱动,API 简单直观,适合中小型项目。 |
mysql2 | mysql 的升级版,支持 Promise 和连接池优化,性能更优。 |
Sequelize | ORM 框架,提供对象关系映射功能,适合复杂业务场景。 |
示例代码:安装 mysql2
npm install mysql2
连接 MySQL 的核心步骤
建立数据库连接
连接 MySQL 需要提供以下关键参数:
- host:MySQL 服务器地址(本地通常为
localhost
)。 - user:数据库用户名(如
root
)。 - password:用户密码。
- database:要连接的数据库名称。
代码示例:基础连接配置
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'your_password',
database: 'test_db'
});
connection.connect((err) => {
if (err) throw err;
console.log('Connected to MySQL database!');
});
执行 SQL 查询
连接成功后,可通过 query
方法执行 SQL 语句。例如查询用户表数据:
connection.query(
'SELECT * FROM users WHERE age > ?', [18],
(error, results, fields) => {
if (error) throw error;
console.log('查询结果:', results);
connection.end(); // 关闭连接
}
);
连接池优化
频繁的单次连接会消耗资源,使用连接池可复用连接,提升性能。
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'your_password',
database: 'test_db',
connectionLimit: 10 // 最大连接数
});
pool.query('SELECT NOW() AS current_time', (err, results) => {
console.log('当前时间:', results[0].current_time);
});
错误处理与事务管理
异常捕获机制
数据库操作可能出现网络中断、SQL 语法错误等问题,需通过 try...catch
或回调函数捕获错误。
代码示例:Promise 风格的错误处理
const mysql = require('mysql2/promise');
async function queryDatabase() {
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'your_password',
database: 'test_db'
});
try {
const [rows] = await connection.execute(
'INSERT INTO users (name, age) VALUES (?, ?)',
['Alice', 25]
);
console.log('插入成功:', rows);
} catch (error) {
console.error('操作失败:', error.message);
} finally {
await connection.end();
}
}
queryDatabase();
事务的 ACID 特性
事务确保多个操作的原子性。例如,在转账场景中,需保证两个账户的增减操作同时成功或失败。
connection.beginTransaction(async (err) => {
if (err) throw err;
try {
await connection.query('UPDATE accounts SET balance = balance - 100 WHERE user_id = 1');
await connection.query('UPDATE accounts SET balance = balance + 100 WHERE user_id = 2');
await connection.commit(); // 提交事务
} catch (error) {
await connection.rollback(); // 回滚事务
throw error;
}
});
高级技巧与性能优化
连接池配置优化
通过调整连接池参数,可平衡资源占用与并发性能:
const pool = mysql.createPool({
...基础配置,
waitForConnections: true, // 是否等待新连接
queueLimit: 0, // 连接队列上限(0 表示无限)
idleTimeout: 60000 // 空闲连接超时时间(毫秒)
});
预编译语句防 SQL 注入
直接拼接 SQL 字符串可能导致安全漏洞,使用预编译参数可有效防御:
// 错误示例(存在注入风险)
const unsafeQuery = `SELECT * FROM users WHERE username = ${username}`;
// 正确示例(预编译参数)
const safeQuery = 'SELECT * FROM users WHERE username = ?';
connection.query(safeQuery, [username]);
索引优化与慢查询分析
为高频查询字段添加索引可显著提升性能。例如:
ALTER TABLE users ADD INDEX idx_name_age (name, age);
实际案例:用户管理系统
功能需求
实现一个简单的用户管理接口,包含以下操作:
- 创建用户表。
- 添加新用户。
- 查询用户列表。
- 更新用户信息。
完整代码实现
const mysql = require('mysql2/promise');
async function main() {
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'your_password',
database: 'test_db'
});
// 创建用户表
await connection.execute(
'CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)'
);
// 添加新用户
const [insertResult] = await connection.execute(
'INSERT INTO users (name, age) VALUES (?, ?)',
['Bob', 30]
);
console.log('插入 ID:', insertResult.insertId);
// 查询所有用户
const [users] = await connection.execute('SELECT * FROM users');
console.table(users);
// 更新用户年龄
await connection.execute(
'UPDATE users SET age = ? WHERE name = ?',
[31, 'Bob']
);
await connection.end();
}
main().catch(console.error);
结论
通过本文的讲解,开发者可以掌握 Node.js 连接 MySQL 的核心流程,从基础连接到高级优化,逐步构建高效稳定的数据库交互逻辑。实践案例的代码示例提供了完整的开发参考,而连接池、事务管理等技巧则帮助开发者应对真实场景的挑战。建议读者在掌握本文内容后,尝试结合 Express.js 或 Koa.js 框架,构建完整的 API 服务。未来可进一步探索 ORM 框架(如 TypeORM、Prisma)或数据库分片等进阶技术,持续提升后端开发能力。