js怎么连接数据库
- 数据库
- 2025-08-07
- 8
mysql/
pg 等库,先安装依赖,再通过配置参数建立
以下是针对「JavaScript如何连接数据库」的完整技术解析,涵盖核心概念、主流方案、代码实现及最佳实践:
基础认知:JS与数据库交互的本质
JavaScript本身是运行在客户端/服务端的脚本语言,其与数据库的交互需依赖特定运行环境:
| 运行环境 | 典型场景 | 限制条件 |
|—————-|—————————|————————|
| 浏览器端 | 网页应用展示层 | 禁止直连数据库
️存在XSS/CSRF风险 |
| Node.js | 后端服务、微服务架构 | 可直连数据库
️需控制权限 |
- 绝对禁止在浏览器端直接写入数据库连接逻辑(会导致严重安全隐患)
- 推荐架构:前端JS → 后端API(Node.js/Python等)→ 数据库
- 特殊场景:Electron桌面应用可通过主进程间接访问数据库
Node.js环境下的数据库连接方案
(一)关系型数据库连接(以MySQL为例)
准备工作
npm install mysql2 dotenv # mysql2比原生mysql性能更好
创建.env文件存储敏感信息:
DB_HOST=localhost DB_USER=root DB_PASSWORD=your_password DB_NAME=mydb
核心代码实现

require('dotenv').config(); // 加载环境变量
const mysql = require('mysql2/promise'); // 使用Promise版本
// 创建连接池(生产环境必备)
const pool = mysql.createPool({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
waitForConnections: true, // 排队等待连接释放
connectionLimit: 10, // 最大连接数
queueLimit: 0 // 无限排队请求
});
// 执行查询示例
async function queryUser() {
const [rows] = await pool.query('SELECT FROM users WHERE id = ?', [1]);
console.log(rows); // [ { id: 1, name: '张三', ... } ]
}
// 事务处理示例
async function transferMoney(fromId, toId, amount) {
const connection = await pool.getConnection();
try {
await connection.beginTransaction();
// 扣款操作
await connection.query(`UPDATE accounts SET balance -= ${amount} WHERE id = ${fromId}`);
// 收款操作
await connection.query(`UPDATE accounts SET balance += ${amount} WHERE id = ${toId}`);
await connection.commit();
return true;
} catch (error) {
await connection.rollback();
throw error;
} finally {
connection.release(); // 归还连接至池中
}
}
性能优化要点
| 优化项 | 说明 |
|—————-|———————————————————————-|
| 连接池 | 复用现有连接,避免频繁创建/销毁 |
| 预处理语句 | 使用占位符防止SQL注入,提升执行效率 |
| 字段过滤 | SELECT 改为SELECT id,name减少数据传输量 |
| 索引优化 | 确保高频查询字段建立索引 |
| 分页查询 | 使用LIMIT offset, count配合索引实现高效分页 |
(二)NoSQL数据库连接(以MongoDB为例)
依赖安装
npm install mongodb dotenv
核心代码实现

require('dotenv').config();
const { MongoClient } = require('mongodb');
// URI格式:mongodb://username:password@host:port/database?authSource=admin
const uri = `mongodb://${process.env.DB_USER}:${process.env.DB_PASSWORD}@${process.env.DB_HOST}:27017/${process.env.DB_NAME}?authSource=admin`;
async function runQuery() {
const client = new MongoClient(uri);
try {
await client.connect();
const db = client.db();
const collection = db.collection('users');
// 插入文档
const insertResult = await collection.insertOne({ name: '李四', age: 25 });
console.log('Inserted ID:', insertResult.insertedId);
// 查询文档
const findResult = await collection.find({ age: { $gt: 20 } }).toArray();
console.log('Matched documents:', findResult);
// 更新文档
const updateResult = await collection.updateOne(
{ name: '李四' },
{ $set: { age: 26 } }
);
console.log('Modified count:', updateResult.modifiedCount);
// 删除文档
const deleteResult = await collection.deleteOne({ name: '李四' });
console.log('Deleted count:', deleteResult.deletedCount);
} finally {
await client.close();
}
}
差异对比表
| 特性 | MySQL | MongoDB |
|——————–|——————————-|——————————|
| 数据模型 | 二维表结构 | JSON文档结构 |
| Schema约束 | 强Schema(需预定义字段类型) | 弱Schema(动态模式) |
| 事务支持 | 完整ACID事务 | 单文档级事务(多文档需手动) |
| 聚合操作 | SQL语法复杂 | 管道操作符直观易用 |
| 适用场景 | 金融系统、ERP等严谨业务 | 内容管理、日志系统等灵活需求 |
浏览器端的安全替代方案
RESTful API架构
通信流程:
前端JS → HTTP请求 → Node.js中间层 → 数据库操作 → 返回JSON数据 → 前端渲染
示例代码(Express框架):

const express = require('express');
const app = express();
app.use(express.json());
// 获取用户列表接口
app.get('/api/users', async (req, res) => {
const [rows] = await pool.query('SELECT id, name, email FROM users');
res.json(rows);
});
// 添加用户接口
app.post('/api/users', async (req, res) => {
const { name, email } = req.body;
const [result] = await pool.query(
'INSERT INTO users (name, email) VALUES (?, ?)',
[name, email]
);
res.status(201).json({ id: result.insertId });
});
WebSocket实时通信
适用于聊天室、实时监控等场景:
// 服务端(socket.io)
const io = require('socket.io')(server);
io.on('connection', (socket) => {
socket.on('new_message', async (data) => {
// 保存消息到数据库
await pool.query('INSERT INTO messages (content) VALUES (?)', [data.content]);
// 广播给所有客户端
io.emit('message_received', data);
});
});
常见错误及解决方案
| 错误类型 | 典型表现 | 解决方案 |
|---|---|---|
| 连接超时 | ECONNREFUSED | 检查数据库服务是否启动 |
| 认证失败 | Access denied for user | 核对用户名/密码/权限 |
| SQL语法错误 | You have an error in your SQL syntax | 使用EXPLAIN分析查询计划 |
| 连接泄漏 | Too many connections | 确保每次使用后释放连接 |
| CORS拦截 | Access-Control-Allow-Origin缺失 | 配置CORS中间件 |
相关问答FAQs
Q1: 为什么不能直接在浏览器端用JS连接数据库?
A: 主要基于两大原因:
- 安全风险:若允许前端直接访问数据库,反面用户可通过修改请求参数执行任意SQL命令(SQL注入攻击),甚至删除整个数据库,现代浏览器出于同源策略限制,也禁止跨域直接访问数据库端口。
- 架构设计:Web应用遵循分层架构,前端负责视图层,后端负责业务逻辑和数据持久化,直接连接会破坏这种安全隔离,导致代码维护困难。
Q2: Node.js连接数据库时出现”Too many connections”如何解决?
A: 这是典型的连接泄漏问题,解决方案如下:
- 使用连接池:通过
mysql.createPool()或pg.Pool管理连接,设置合理的connectionLimit(建议5-20)。 - 及时释放连接:使用
connection.release()显式归还连接,或在finally块中确保释放。 - 检查未关闭的连接:确保每个查询都使用
async/await正确处理,避免回调地狱导致的连接未释放。 - 监控连接状态:使用
SHOW FULL PROCESSLIST;命令查看当前活跃连接,定位
