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

js连接sql数据库代码怎么写

Node.js的 mysql库,先安装依赖,再通过创建连接、编写SQL语句及回调函数实现JS与 SQL数据库交互,示例:`const mysql = require(‘mysql’); // 后续配置连接参数等

JavaScript中连接SQL数据库通常需要借助Node.js环境,因为浏览器端的JavaScript出于安全限制无法直接访问数据库,以下是详细的实现步骤和代码示例:

基础准备与核心模块选择

  1. 运行环境要求:必须基于Node.js平台(如v14+版本),通过npm init初始化项目后安装对应数据库驱动包,例如连接MySQL可选用mysql2库,这是目前性能最优且功能完善的官方推荐驱动;若需操作SQL Server则建议使用tediousmssql模块。
  2. 依赖安装命令参考:对于MySQL场景执行npm install mysql2 dotenv,其中dotenv用于管理敏感配置信息,安装完成后会在package.json中自动记录版本号,确保团队协作时的依赖一致性。

配置文件规范化设计

推荐创建独立的.env文件存储密钥类参数:

DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_secure_password
DB_NAME=testdb
DB_PORT=3306

这种设计遵循十二要素应用宣言的最佳实践,配合dotenv加载机制可实现开发/生产环境隔离,实际项目中应避免将配置文件提交至版本控制系统,建议加入.gitignore清单。

js连接sql数据库代码怎么写  第1张

完整连接流程实现

建立数据库连接池(推荐方案)

采用连接池模式能显著提升高并发场景下的性能表现:

const { createPool } = require('mysql2/promise'); // 使用Promise版API
require('dotenv').config(); // 加载环境变量
// 创建可复用的连接实例
const pool = createPool({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    port: Number(process.env.DB_PORT),
    waitForConnections: true, // 强制等待可用连接防止过载
    connectionLimit: 10,     // 根据CPU核心数动态调整合理值
    queueTimeout: 5000       // 设置超时阈值避免永久阻塞
});
// 健康检查函数
async function testConnection() {
    try {
        const conn = await pool.getConnection();
        const [rows] = await conn.query('SELECT NOW() AS currentTime');
        console.log(' 数据库响应时间:', rows[0].currentTime);
        conn.release(); // 重要!手动释放回连接池
    } catch (err) {
        throw new Error(`数据库连通性异常: ${err.message}`);
    }
}

上述代码实现了三个关键特性:①异步无阻塞操作;②自动资源回收机制;③内置负载均衡策略,相比单次短链接模式,连接池可将吞吐量提升。

js连接sql数据库代码怎么写  第2张

CRUD标准操作模板

以用户表操作为例展示完整生命周期管理:

class UserRepository {
    constructor(dataSource) {
        this.ds = dataSource; // 注入数据源依赖
    }
    // 创建记录(带事务支持)
    async createUser(userData) {
        const result = await this.ds.execute(`
            INSERT INTO users (username, email, created_at) 
            VALUES (?, ?, NOW())`, [userData.name, userData.email]);
        return { insertId: result.insertId, affectedRows: result.affectedRows };
    }
    // 查询优化:分页+防SQL注入
    async findPaginated({ page = 1, perPage = 10, filters = {} }) {
        const offset = (page 1)  perPage;
        let queryText = 'SELECT  FROM users WHERE 1=1';
        const params = [];
        // 动态构建WHERE条件
        Object.entries(filters).forEach(([key, val]) => {
            if (val !== undefined && val !== null) {
                queryText += ` AND ${key} LIKE ?`;
                params.push(`%${val}%`);
            }
        });
        queryText += ` ORDER BY id DESC LIMIT ? OFFSET ?`;
        params.push(perPage, offset);
        const [records] = await this.ds.query(queryText, params);
        return records;
    }
    // 更新操作示例
    async updateProfile(userId, updates) {
        const allowedFields = ['bio', 'avatar_url']; // 白名单机制保安全
        const setClauses = Object.keys(updates)
            .filter(field => allowedFields.includes(field))
            .map((field, i) => `${field} = ?`);
        if (!setClauses.length) throw new Error('无效更新字段');
        const finalQuery = `UPDATE users SET ${setClauses.join(', ')} WHERE id = ?`;
        const args = [...Object.values(updates), userId];
        const { affectedRows } = await this.ds.execute(finalQuery, args);
        return affectedRows > 0;
    }
    // 删除软删除实现
    async logicalDelete(userId) {
        const { affectedRows } = await this.ds.execute(
            'UPDATE users SET deleted_at = NOW() WHERE id = ?', [userId]
        );
        return affectedRows === 1;
    }
}

该仓储层设计包含多项企业级特性:①预编译语句防御注入攻击;②白名单字段验证机制;③物理删除替代方案;④类型安全的参数绑定,每个公共方法都返回标准化的结果对象,便于上层服务层统一处理异常。

js连接sql数据库代码怎么写  第3张

高级进阶技巧

  1. 读写分离架构支持:可通过配置主从集群实现热点数据自动路由,在创建连接池时传入多个host地址,配合中间件自动判断读/写操作类型。
  2. 查询缓存策略:对频繁执行且结果集稳定的查询启用Redis二级缓存,减少数据库压力,例如用户个人信息页的数据可采用TTL过期策略缓存。
  3. 慢日志监控:通过订阅field::slow事件捕获执行超过阈值的SQL语句,结合APM工具进行性能瓶颈定位。
  4. ORM集成扩展:虽然原生驱动足够灵活,但复杂项目可引入Sequelize等ORM框架获得更优雅的对象映射能力,此时仍需注意N+1问题防范。

常见误区警示

错误类型 现象特征 解决方案
连接泄露 内存持续增长直至OOM崩溃 确保每次获取连接后必须显式调用release()或使用try/finally块
异步混乱 回调地狱导致维护困难 坚持使用async/await语法糖保持线性流程
事务失效 多步操作间数据不一致 显式开启事务并正确提交/回滚
SQL注入 用户输入直接影响语句结构 严格使用参数化查询禁止字符串拼接

相关问答FAQs

Q1:为什么不能直接用浏览器端的JavaScript连接数据库?
A:这是由Web同源策略决定的浏览器安全沙箱机制所致,允许网页脚本直连数据库会导致CSRF攻击风险剧增,用户凭证可能被反面网站窃取,所有数据库交互都必须经过后端服务中转,这是Web应用的基本安全准则。

Q2:如何处理生产环境中的数据库凭证安全问题?
A:永远不要将明文密码提交到代码仓库!正确做法是:①使用环境变量存储敏感信息;②配置CI/CD流水线自动注入密钥;③启用VPC网络隔离数据库实例;④定期轮换数据库访问密钥,对于云平台部署,建议使用Secrets Manager专业凭据

0