NodeJS 后端开发 07 MySQL数据库连接池开发生产应用

本文介绍了在生产环境中如何使用MySQLJS库创建数据库连接池,以提高效率并避免频繁建立和关闭连接的开销。通过连接池管理数据库连接,可以在需要时获取并释放连接,确保资源的有效利用。文中还提供了连接池状态查看及SQL执行的示例代码,并强调了不应手动销毁连接的重要性。

前篇 【NodeJS 后端开发 06 连接MySQL 】简单尝试了mysql js库来连接数据库。

该文章分享的js代码不适用于生成环境使用。

在生产环境中,后端服务对数据库连接的管理都是通过一个 数据库连接池。

在接口需要获取数据库数据的时候,从池中取一个活跃连接,到数据库取完数据/执行数据变更操作后,释放连接并放回连接池。

  

上图所示,当业务线程处理数据时,使用连接;右边为业务处理结束,释放连接,放回连接池中。

这里分享一个连接池的JS代码

const mysql = require("mysql");

const port = 3306

//创建数据库连接池,连接到指定IP
const pool = mysql.createPool({
    host: 'localhost',
    port: port,
    user: 'root',
    password: '12345678',
    database: 'demo20210330',
    multipleStatements: true
});

// 定义sql执行函数
// 并允许用户输入连接执行成功的回调函数onSuccess,以及错误回调onError
const runSql = function(sql, onSuccess, onError) {
    pool.getConnection(function(err, conn) {
        if (err) {
            onError(err);
            return;
        }
        conn.query(sql, function(err, data) {
            try {
                if (err) {
                    onError(err);
                } else {
                    onSuccess(data);
                }
            } catch(err) {
                onError(err);
            } finally {
                console.log('release connection');
                conn.release();
            }
        });
    });
};

//查看池的状态
const showPool = function() {
    console.log('pool: ', pool);
};

module.exports.show = showPool;
module.exports.runSql = runSql;

这个工具JS库runSql函数中每次执行SQL,最后不管结果如何,总会在finally内释放链接,达到了连接自动回收的作用。

PS:上面的数据库配置密码过于简单,实际环境建议改复杂点(推荐:通过环境配置来解密数据库密码)。

保存代码为dbpool.js, 进入Node终端;然后输入以下代码并查看结果:

var pool = require('./dbpool')

pool.runSql("select * from company;", (e)=>console.log(e)

PS:下面的数据库在前一篇文章中提前创建好了

输入pool.show() 查看连接池状态, 比如连接信息,空闲的数据库连接等。

   

注意事项:连接池的连接不要手动去调用destroy(销毁连接)。
 

连接池的作用

因为销毁连接,当业务需要的时候调用数据库获取数据的时候,需要重新建立连接(TCP连接),这个过程开销是很大的。

相比之下,维持一个长连接省去很多建立重连TCP的时间。

起到了缓冲作用,而且所有数据库连接都会在缓存池里被统一管理。

上文是MySQL JS库自带的连接池,普通应用开发上面的足够,在Github上还有一个通用连接池项目:https://github.com/coopernurse/node-pool

对了,学委还有这个可以关注长期阅读 =>雷学委趣味编程故事汇编
或者=> 雷学委NodeJS系列

后面会单独发一篇解析。

持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
创作不易,请多多支持,点赞收藏支持学委吧!

<think>首先,用户的问题是:“我想获取前端使用Node.js开发后端接口以及链接数据库的详细过程 请问前端使用Node.js开发后端接口并链接数据库的详细步骤”。这里的“前端”可能是个误称,因为Node.js是用于后端开发的;用户可能指的是“开发者使用Node.js开发后端”,其中涉及前端(客户端)和后端(服务器端)的交互。 关键点: - 开发后端接口:使用Node.js创建API端点。 - 链接数据库:连接到数据库,如MySQL或其他。 从引用中: - 引用[1]:介绍了Node.js作为后端语言。 - 引用[2]:提到了使用http连接后端与数据库,在js代码中配置数据库连接。 - 引用[3]:强调了Node.js的优势。 - 引用[4]:提供了项目介绍,包括接口设计、数据库结构以及原生Node.js开发(不使用框架)。引用[4]特别详细,描述了博客系统的开发,包括HTTP请求过程、开发环境设置、路由和数据分离。 用户上次的问题没有被提供,所以我只能基于当前问题和引用来回答。 系统级指令: - 所有行内数学表达式必须用$...$格式。 - 独立公式用$$...$$单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾自然地添加引用标识。 回答结构: - 结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 步骤概要: 1. **准备工作**:安装Node.js和相关工具。 2. **创建Node.js项目**:初始化项目,设置package.json。 3. **数据库连接**:选择数据库(如MySQL),安装驱动(如mysql2),配置连接。 4. **创建HTTP服务器**:使用Node.js的http模块或express框架(但用户提到原生Node.js,所以用http模块)。 5. **定义路由和处理程序**:处理不同API端点。 6. **数据库操作**:执行CRUD操作(创建、读取、更新、删除)。 7. **处理HTTP请求**:解析请求数据,执行数据库操作,返回响应。 8. **测试API**:使用工具如Postman测试接口。 详细步骤: - 引用[4]提到使用nodemon和cross-env,所以要包括。 - 接口设计参考引用[4]的例子。 现在,构建回答: - **标题**: 前端使用Node.js开发后端接口及链接数据库的详细步骤 - **内容**: 分步骤解释。 - **引用**: 在适当的地方添加引用标识,如[^4]。 最终,生成相关问题。 详细步骤: 1. **准备工作** - 安装Node.js。 - 安装npm或yarn。 - 设置项目目录。 2. **创建Node.js项目** - 初始化npm:`npm init -y` - 安装必要模块,如http, mysql2(或具体数据库驱动)。 3. **数据库连接** - 选择数据库:例如MySQL。 - 安装mysql2:`npm install mysql2` - 在代码中创建连接池或连接对象。 - 示例代码:配置数据库连接信息(host, user, password, database)。 4. **创建HTTP服务器** - 使用http模块创建服务器。 - 监听端口。 - 处理请求:解析URL和method。 5. **定义路由和API端点** - 根据URL和方法路由请求。 - 实现接口如GET /api/blog/list, POST /api/blog/new等。 6. **数据库操作** - 在处理程序中执行SQL查询。 - 使用CRUD操作。 - 示例:查询数据库返回博客列表。 7. **处理请求数据** - 解析GET请求的查询参数。 - 解析POST请求的body数据(使用querystring或body-parser替代)。 8. **返回响应** - 设置响应头(Content-Type)。 - 发送JSON响应。 9. **开发环境设置** - 使用nodemon自动重启:`npm install -g nodemon`,然后使用nodemon运行app。 - 使用cross-env设置环境变量。 10. **测试** - 使用Postman测试API。 添加引用: - 在描述接口设计时,参考引用[4]。 生成相关问题: - 类似系统级指令的示例。 完整回答结构: - 简述Node.js后端开发。 - 分步详细步骤。 - 代码块演示(如创建HTTP服务器、数据库连接)。 - 相关问题。 </think>### Node.js 开发后端接口及链接数据库的详细步骤 作为 JavaScript 运行环境,Node.js 允许开发者使用 JavaScript 开发后端接口并连接数据库(如 MySQL),实现全栈开发能力。以下步骤基于原生 Node.js(不使用框架如 Express),参考博客系统的接口设计[^4],逐步解释详细过程。确保已安装 Node.jsMySQL 数据库。 #### 步骤 1: 准备工作与环境设置 1. **安装依赖工具**: - 安装 Node.js(从官网下载)。 - 安装 MySQL 数据库并创建数据库和表(例如,参考博客系统的用户表 `users` 和博客表 `blogs`[^4])。 - 使用 npm 初始化项目: ```bash npm init -y # 创建 package.json ``` - 安装必要模块: ```bash npm install mysql2 nodemon cross-env --save ``` - `mysql2`: MySQL 驱动库。 - `nodemon`: 自动重启 Node.js 应用(监控文件变化)[^4]。 - `cross-env`: 跨平台设置环境变量(如数据库配置)[^4]。 2. **项目结构设置**: - 创建目录结构(路由分离): ``` project/ ├── config/ 数据库配置 ├── routes/ 路由文件 ├── controllers/ 业务逻辑处理 ├── models/ 数据库模型 ├── app.js 主入口文件 ├── package.json ``` #### 步骤 2: 配置数据库连接 1. **创建数据库配置文件**: - 在 `config/db.js` 中写入 MySQL 连接信息: ```javascript const mysql = require('mysql2'); // 使用 cross-env 设置环境变量(避免硬编码敏感信息) const pool = mysql.createPool({ host: process.env.DB_HOST || 'localhost', user: process.env.DB_USER || 'root', password: process.env.DB_PASSWORD || 'password', database: process.env.DB_NAME || 'blog_db', waitForConnections: true, connectionLimit: 10, }); module.exports = pool.promise(); // 导出 Promise 接口 ``` - 通过 `cross-env` 设置环境变量(e.g., 在 `package.json` 中添加脚本:`"dev": "cross-env DB_HOST=localhost DB_USER=root DB_PASSWORD=123456 nodemon app.js"`)[^4]。 2. **验证数据库连接**: - 测试连接: ```javascript const pool = require('./config/db'); pool.query('SELECT 1 + 1 AS solution') .then(([rows]) => { console.log('Database connected:', rows[0].solution === 2); }) .catch(err => console.error('Connection failed:', err)); ``` #### 步骤 3: 创建 HTTP 服务器和处理路由 1. **初始化 HTTP 服务器**: - 在 `app.js` 中使用 Node.js 内置 `http` 模块: ```javascript const http = require('http'); const url = require('url'); const server = http.createServer((req, res) => { const parsedUrl = url.parse(req.url, true); // 解析 URL const path = parsedUrl.pathname; const method = req.method; const query = parsedUrl.query; // GET 参数 let body = ''; req.on('data', chunk => body += chunk); // 接收 POST 数据 req.on('end', () => { handleRoutes(path, method, query, body, req, res); // 路由处理 }); }); server.listen(3000, () => console.log('Server running on port 3000')); ``` 2. **定义路由处理逻辑**: - 在 `routes/blogRoutes.js` 中实现接口路由(参考博客系统设计[^4]): ```javascript const handleRoutes = (path, method, query, body, req, res) => { // 设置响应头为 JSON res.setHeader('Content-Type', 'application/json'); // 路由分发 if (path === '/api/blog/list' && method === 'GET') { // 处理获取博客列表 getBlogList(query, res); } else if (path === '/api/blog/new' && method === 'POST') { // 处理新增博客 createBlog(body, res); } else { // 其他接口... res.statusCode = 404; res.end(JSON.stringify({ error: 'Not Found' })); } }; module.exports = handleRoutes; ``` #### 步骤 4: 实现业务逻辑和数据库操作 1. **数据库模型操作**: - 在 `models/blogModel.js` 中定义 CRUD 函数: ```javascript const pool = require('../config/db'); // 示例:获取博客列表 const getBlogList = async (query, res) => { const { author, keyword } = query; // GET 参数过滤 let sql = 'SELECT * FROM blogs'; let params = []; if (author || keyword) { sql += ' WHERE'; if (author) { sql += ' author LIKE ?'; params.push(`%${author}%`); } if (keyword) { sql += author ? ' AND' : ''; sql += ' title LIKE ?'; params.push(`%${keyword}%`); } } try { const [rows] = await pool.query(sql, params); res.statusCode = 200; res.end(JSON.stringify(rows)); } catch (err) { res.statusCode = 500; res.end(JSON.stringify({ error: err.message })); } }; // 示例:创建新博客 const createBlog = async (body, res) => { try { const { title, content, author } = JSON.parse(body); // 解析 POST JSON const [result] = await pool.query( 'INSERT INTO blogs (title, content, author) VALUES (?, ?, ?)', [title, content, author] ); res.statusCode = 201; res.end(JSON.stringify({ id: result.insertId })); } catch (err) { res.statusCode = 400; res.end(JSON.stringify({ error: 'Invalid data' })); } }; module.exports = { getBlogList, createBlog }; ``` 2. **集成路由与模型**: - 在 `routes/blogRoutes.js` 中引入模型: ```javascript const { getBlogList, createBlog } = require('../models/blogModel'); // 路由处理函数中调用... ``` #### 步骤 5: 运行和测试接口 1. **启动服务器**: - 使用 nodemon 自动重启: ```bash npm run dev # 基于 package.json 的脚本 ``` 2. **测试 API**: - 使用工具如 Postman 或 curl: - **获取博客列表**: ```bash curl "http://localhost:3000/api/blog/list?author=zhangsan" ``` - **创建新博客**: ```bash curl -X POST -H "Content-Type: application/json" -d '{"title":"New Post","content":"Hello","author":"lisi"}' http://localhost:3000/api/blog/new ``` #### 关键注意事项 - **HTTP 连接过程**:Node.js 后端处理 DNS 解析、TCP 连接(三次握手、四次挥手),并响应数据[^4]。 - **性能优化**:使用连接池(如 `mysql2`)减少数据库连接开销。 - **安全性**:避免 SQL 注入(使用参数化查询),并验证输入数据。 - **前后端对接**:前端(如 JavaScript 或 ArkTs)通过 HTTP 请求调用后端 API[^2],Node.js 的异步非阻塞模型支持高并发处理[^3]。 通过以上步骤,您可以构建原生 Node.js 后端接口,实现数据库连接和完整 CRUD 功能。Node.js 的轻量级架构使其成为高效开发后端服务的理想选择[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷学委

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值