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 数据库,从环境搭建到高级优化技巧,帮助开发者快速掌握这一核心技能。


环境准备与依赖安装

开发环境配置

在开始之前,需要确保本地已安装以下工具:

  1. Node.js:访问 Node.js 官网 下载对应操作系统的安装包。
  2. MySQL:根据操作系统选择安装方式,例如在 Ubuntu 上可通过 sudo apt-get install mysql-server 安装。
  3. MySQL Workbench(可选):用于可视化管理数据库的图形化工具。

安装数据库驱动

Node.js 本身不直接支持 MySQL,需通过第三方驱动库实现连接。以下是常用的驱动库及其特点:

库名特点
mysql经典的轻量级驱动,API 简单直观,适合中小型项目。
mysql2mysql 的升级版,支持 Promise 和连接池优化,性能更优。
SequelizeORM 框架,提供对象关系映射功能,适合复杂业务场景。

示例代码:安装 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);  

实际案例:用户管理系统

功能需求

实现一个简单的用户管理接口,包含以下操作:

  1. 创建用户表。
  2. 添加新用户。
  3. 查询用户列表。
  4. 更新用户信息。

完整代码实现

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)或数据库分片等进阶技术,持续提升后端开发能力。

最新发布