ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] >[success] # Nodejs 链接 mysql 做成工具 上一章做了一个简单的 **demo** ,实现了如何在 **nodejs** 中操作数据库,但是还是没法直接去用,**需要封装成一个公共的方法来使用** ,接下来实现把它封装成公共方法 1. 首先我们在我们的博客项目 **blog-1 文件夹中安装 MySQL 插件** ,执行指令 `npm i mysql --registry=https://registry.npmmirror.com` 2. 然后我们 **在 src 目录下创建 config 文件夹 跟 db.js 文件** ,**db.js** 这里 **根据不同环境返回不同的 mysql 配置** ,然后再创建一个 **db 文件夹,再在里面创建一个 mysql.js** ,专门用来写 **mysql 封装** 的 **公共方法** 的 **文件** **文件目录结构:** ~~~ blog-1 // 项目文件夹 |__ bin // 可执行文件文件夹 | |__ www.js // 项目启动入口文件 | |__ src // 放接口的文件夹 | |__ router // 路由(接口)文件夹 | | |__ blog.js // 【博客类型】有关的接口都写在这里 | | |__ user.js // 【用户类型】有关的接口都写在这里 | | | |__ model // 【存放数据模型】的文件夹 | | |__ resModel.js // 【数据模型类】文件 | | | |__ controller // 【从数据库取出数据,然后处理数据,返回给路由层】 | | |__ blog.js // 【博客类型】处理数据的文件 | | |__ user.js // 【用户类型】处理数据的文件 | | | |__ config // 储存配置的文件夹 | | |__ db.js // 根据不同环境返回不同的 mysql 配置 | | | |__ db // 有关数据储存的文件夹 | |__ mysql.js // 封装 mysql 公共方法的文件 | |__ app.js // 处理server业务逻辑的方法的文件 |__ package.json // 初始化项目文件 ~~~ **blog-1/src/config/db.js** ~~~ const env = process.env.NODE_ENV // 环境变量,这里的环境变量是在 package.json 中声明的 // 配置 let MYSQL_CONF if(env === 'dev'){ // 本地开发环境配置 MYSQL_CONF = { host: 'localhost', // 域 user: 'root', // 账号 password: 'Wjc13842859435.', // 密码 port: '3306', // 端口号 database: 'myblog' // database: 'myblog' 相当于在 workbench 中执行的 use myblog 指令,意思是使用 myblog 数据库 } } if(env === 'production'){ // 线上环境配置(暂时没有服务器,先拿开发环境配置充当服务器配置,但是实际项目中这里一定是服务器线上的配置) MYSQL_CONF = { host: 'localhost', // 域 user: 'root', // 账号 password: 'Wjc13842859435.', // 密码 port: '3306', // 端口号 database: 'myblog' // database: 'myblog' 相当于在 workbench 中执行的 use myblog 指令,意思是使用 myblog 数据库 } } module.exports = { MYSQL_CONF } ~~~ **blog-1/src/db/mysql.js** ~~~ // 引入 mysql const mysql = require('mysql') // 引入配置(根据不同环境返回不同配置) const { MYSQL_CONF } = require('../config/db') // 创建链接对象 const con = mysql.createConnection(MYSQL_CONF) // 开始连接 con.connect() // 统一执行 sql 的函数 function exec(sql){ const promise = new Promise((resolve, reject) => { con.query(sql, (err, result) => { if(err) { // 失败 reject(err) return } resolve(result) // 成功 }) }) return promise } // 关闭连接 // con.end() module.exports = { exec } ~~~ 这里的 **关闭连接** 为什么注释上呢?因为我们这个 **创建链接对象** 就创建一次,每次使用的是 **exec 方法** ,也就是一个 **单例模式** ,无需每次都创建,所以就不需要 **关闭连接**,如果关闭了连接,后续就查不了了,如果每次都连接数据库就需要关闭,像下图这种,连接了好多次都没有关闭, ![](https://img.kancloud.cn/33/94/33949b813dbc38ba12f17759612ca533_149x362.png) 过一会就会提示打开连接超时了: ![](https://img.kancloud.cn/fa/db/fadbb51d0dabed6b40d71d1a35d2673a_554x103.png) 当你使用 **MySQL 数据库** ,在 **访问结束后** , **不关闭连接** 就相当于 **停车后不驾车离开停车场(Mysql),如果没有其他车辆退出该停车场,停车场就会满,并且不允许新的车辆进入**。同样地,**如果没有关闭数据库连接,并且超出了最大连接数,MySQL 就会拒绝新的连接并导致程序崩溃** 。所以,及时关闭数据库连接是非常重要的。