在JavaScript后端开发中,Node.js搭配SQL操作关系型数据库是非常常见的技术组合,既能利用Node.js的异步特性提升服务性能,也能通过SQL灵活操作结构化数据。下面我们就详细讲解二者的交互方式和实际应用场景。

Node.js与SQL交互的基础准备
要实现Node.js和SQL的交互,首先需要准备好对应的环境和依赖。我们通常选择MySQL作为演示用的关系型数据库,Node.js端需要安装对应的数据库驱动包。
1. 环境准备
确保本地已经安装Node.js运行环境和MySQL数据库,并且已经创建了用于测试的数据库和表。比如我们先创建一个用户表,SQL语句如下:
-- 创建用户表
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
age INT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);2. 安装依赖包
在Node.js项目中,我们使用mysql2包来操作MySQL数据库,它支持Promise语法,更符合Node.js的异步编程习惯。在项目目录下执行安装命令:
npm install mysql2
Node.js执行SQL的核心流程
Node.js操作SQL的核心流程分为四步:创建数据库连接、编写SQL语句、执行SQL并获取结果、处理异常和关闭连接。下面用完整的代码示例演示这个过程。
1. 建立数据库连接
首先需要在Node.js代码中配置数据库连接参数,创建连接池可以提升多次数据库操作的性能,避免频繁创建和销毁连接。
const mysql = require('mysql2/promise');
// 创建数据库连接池
const pool = mysql.createPool({
host: '127.0.0.1',
user: 'root',
password: 'your_password',
database: 'test_db',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
console.log('数据库连接池创建成功');2. 执行SQL查询操作
查询是SQL最常用的操作,下面演示查询用户表中所有数据的完整代码:
async function queryAllUsers() {
try {
// 执行查询SQL
const [rows, fields] = await pool.execute('SELECT * FROM user');
console.log('查询到的用户数据:', rows);
return rows;
} catch (err) {
console.error('查询用户数据失败:', err);
throw err;
}
}
// 调用查询函数
queryAllUsers();3. 执行SQL插入操作
插入数据时需要避免SQL注入问题,mysql2支持参数化查询,会把用户输入的内容当作数据处理,不会执行其中的SQL语句。
async function insertUser(username, age) {
try {
// 参数化插入SQL,?是占位符
const [result] = await pool.execute(
'INSERT INTO user (username, age) VALUES (?, ?)',
[username, age]
);
console.log('插入成功,插入ID:', result.insertId);
return result.insertId;
} catch (err) {
console.error('插入用户数据失败:', err);
throw err;
}
}
// 调用插入函数
insertUser('张三', 25);4. 执行SQL更新和删除操作
更新和删除操作的语法和插入类似,同样使用参数化查询保证安全性:
// 更新用户年龄
async function updateUserAge(userId, newAge) {
try {
const [result] = await pool.execute(
'UPDATE user SET age = ? WHERE id = ?',
[newAge, userId]
);
console.log('更新影响行数:', result.affectedRows);
return result.affectedRows;
} catch (err) {
console.error('更新用户数据失败:', err);
throw err;
}
}
// 删除用户数据
async function deleteUser(userId) {
try {
const [result] = await pool.execute(
'DELETE FROM user WHERE id = ?',
[userId]
);
console.log('删除影响行数:', result.affectedRows);
return result.affectedRows;
} catch (err) {
console.error('删除用户数据失败:', err);
throw err;
}
}SQL在JavaScript后端开发中的常见应用场景
SQL在Node.js后端开发中有非常多的实际应用,覆盖大部分业务数据的操作需求。
1. 用户模块数据管理
用户注册、登录、信息修改、权限查询等功能都需要操作数据库,比如用户登录时验证账号密码:
async function verifyUserLogin(username, password) {
try {
const [rows] = await pool.execute(
'SELECT id, username FROM user WHERE username = ? AND password = ?',
[username, password]
);
if (rows.length > 0) {
return { success: true, userInfo: rows[0] };
} else {
return { success: false, message: '账号或密码错误' };
}
} catch (err) {
console.error('登录验证失败:', err);
return { success: false, message: '系统异常' };
}
}2. 业务数据统计查询
后端经常需要做数据统计,比如统计不同年龄段用户数量,SQL的分组和聚合函数可以高效完成这类需求:
async function countUserByAgeGroup() {
try {
const [rows] = await pool.execute(`
SELECT
CASE
WHEN age < 18 THEN '未成年'
WHEN age BETWEEN 18 AND 40 THEN '青年'
WHEN age BETWEEN 41 AND 60 THEN '中年'
ELSE '老年'
END AS age_group,
COUNT(*) AS user_count
FROM user
GROUP BY age_group
`);
console.log('年龄段用户统计:', rows);
return rows;
} catch (err) {
console.error('统计用户失败:', err);
throw err;
}
}3. 分页查询接口实现
列表数据通常需要分页返回,避免一次性返回过多数据影响性能,结合SQL的LIMIT和OFFSET可以实现分页:
async function getUserListByPage(pageNum = 1, pageSize = 10) {
try {
const offset = (pageNum - 1) * pageSize;
// 查询当前页数据
const [rows] = await pool.execute(
'SELECT * FROM user ORDER BY create_time DESC LIMIT ? OFFSET ?',
[pageSize, offset]
);
// 查询总条数
const [countRows] = await pool.execute('SELECT COUNT(*) AS total FROM user');
const total = countRows[0].total;
return {
list: rows,
total,
pageNum,
pageSize,
totalPage: Math.ceil(total / pageSize)
};
} catch (err) {
console.error('分页查询用户失败:', err);
throw err;
}
}注意事项
- 所有涉及用户输入的SQL操作都必须使用参数化查询,避免SQL注入攻击。
- 数据库连接使用完成后不需要手动关闭连接池,连接池会自动管理连接的创建和回收。
- 生产环境中数据库密码等敏感信息不要直接写在代码里,建议使用环境变量配置。
- 复杂SQL语句建议提前在数据库客户端测试语法正确性,再集成到Node.js代码中。
通过上述方法,就可以在Node.js后端开发中灵活使用SQL操作数据库,满足各类业务场景的数据处理需求,提升后端服务的稳定性和开发效率。
Node.jsSQLJavaScript后端开发数据库操作修改时间:2026-05-27 23:18:19