当前位置:首页 > 数据库 > 正文

js怎么连接数据库

在 Node.js 中使用 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

核心代码实现

js怎么连接数据库  第1张

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

核心代码实现

js怎么连接数据库  第2张

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框架)

js怎么连接数据库  第3张

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: 主要基于两大原因:

  1. 安全风险:若允许前端直接访问数据库,反面用户可通过修改请求参数执行任意SQL命令(SQL注入攻击),甚至删除整个数据库,现代浏览器出于同源策略限制,也禁止跨域直接访问数据库端口。
  2. 架构设计:Web应用遵循分层架构,前端负责视图层,后端负责业务逻辑和数据持久化,直接连接会破坏这种安全隔离,导致代码维护困难。

Q2: Node.js连接数据库时出现”Too many connections”如何解决?

A: 这是典型的连接泄漏问题,解决方案如下:

  1. 使用连接池:通过mysql.createPool()pg.Pool管理连接,设置合理的connectionLimit(建议5-20)。
  2. 及时释放连接:使用connection.release()显式归还连接,或在finally块中确保释放。
  3. 检查未关闭的连接:确保每个查询都使用async/await正确处理,避免回调地狱导致的连接未释放。
  4. 监控连接状态:使用SHOW FULL PROCESSLIST;命令查看当前活跃连接,定位
js
0