Node.js 作为一种基于 Chrome V8 引擎的 JavaScript 运行时,凭借其事件驱动、非阻塞 I/O 的特性,在服务器端开发中得到了广泛应用,操作数据库是 Node.js 开发中的核心任务之一,本文将详细介绍 Node.js 如何操作数据库,包括连接数据库、执行查询、处理结果以及关闭连接等关键步骤。

选择合适的数据库驱动或 ORM
在 Node.js 中操作数据库,首先需要选择合适的数据库驱动或 ORM(对象关系映射)工具,对于关系型数据库(如 MySQL、PostgreSQL、SQLite),可以使用官方提供的驱动或第三方库,如 mysql2、pg、sqlite3;对于 NoSQL 数据库(如 MongoDB),可以使用 mongodb 或 mongoose,ORM 工具如 Sequelize(支持多种 SQL 数据库)和 TypeORM(支持 TypeScript)可以简化数据库操作,提供更高级的抽象。
安装数据库驱动或 ORM
选定工具后,需要通过 npm(Node.js 包管理器)进行安装,安装 mysql2 驱动可以使用以下命令:
npm install mysql2
安装完成后,在项目中通过 require 或 import 引入相应的模块。
连接数据库
连接数据库是操作数据库的第一步,以 mysql2 为例,创建连接池或单连接对象:

const mysql = require('mysql2/promise');
// 创建连接池
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test_db',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
// 使用连接池执行查询
pool.getConnection()
.then(connection => {
// 执行查询
connection.query('SELECT * FROM users')
.then(([rows]) => {
console.log(rows);
connection.release(); // 释放连接
})
.catch(error => {
console.error('查询错误:', error);
connection.release();
});
})
.catch(error => {
console.error('连接错误:', error);
});
执行 SQL 查询
连接成功后,可以执行 SQL 查询。mysql2 支持 Promise 风格的 API,使异步操作更加简洁,执行查询、插入、更新或删除操作:
// 查询数据
const [rows] = await pool.query('SELECT * FROM users WHERE id = ?', [1]);
// 插入数据
const [result] = await pool.query(
'INSERT INTO users (name, email) VALUES (?, ?)',
['John Doe', 'john@example.com']
);
// 更新数据
await pool.query(
'UPDATE users SET email = ? WHERE id = ?',
['new.email@example.com', 1]
);
// 删除数据
await pool.query('DELETE FROM users WHERE id = ?', [1]);
使用参数化查询( 占位符)可以有效防止 SQL 注入攻击。
处理查询结果
查询结果通常以数组或对象的形式返回,对于 SELECT 查询,结果是一个数组,每个元素代表一行数据;对于 INSERT、UPDATE 或 DELETE 查询,结果对象包含 affectedRows(受影响的行数)、insertId(插入的 ID)等信息,处理结果时,可以根据需要进行数据转换或业务逻辑处理。
关闭数据库连接
在使用完数据库后,需要关闭连接以释放资源,对于连接池,通常不需要手动关闭,但在应用退出时可以调用 pool.end() 关闭所有连接:

pool.end()
.then(() => {
console.log('连接池已关闭');
})
.catch(error => {
console.error('关闭连接池错误:', error);
});
错误处理
数据库操作中可能会出现各种错误,如连接失败、查询语法错误等,通过 try-catch 捕获错误或使用 .catch() 处理 Promise 中的错误,确保应用的稳定性:
try {
const [rows] = await pool.query('SELECT * FROM invalid_table');
} catch (error) {
console.error('数据库操作错误:', error);
}
FAQs
Node.js 中如何防止 SQL 注入?
答:使用参数化查询(Prepared Statements)是防止 SQL 注入的最佳方式,通过 或命名占位符传递参数,数据库驱动会自动对参数进行转义,避免恶意 SQL 代码的执行,使用 mysql2 的 占位符:await pool.query('SELECT * FROM users WHERE name = ?', [userInput])。
如何优化 Node.js 中的数据库连接性能?
答:可以使用连接池(Connection Pool)管理数据库连接,避免频繁创建和销毁连接带来的性能开销,合理设置连接池的最大连接数(connectionLimit),根据应用负载调整参数,对于高频查询,可以引入缓存机制(如 Redis)减少数据库访问次数。