技术 | Node.js 连接 MySQL 的正确姿势
以下是开发中的常规操作:
// db.js const mysql = require( 'mysql') const con = mysql. createConnection({ host : "hostName", user : "username", password: "password" }) // 开始连接数据库 con. connect() function querySql( sql, callback){ con. query( sql, ( err, result) => { if ( err) { callback( err, null) } else { callback( err, result) } }) } module. exports = { querySql } // js 在这里使用导出的查库函数 const { querySql } = require( 'db.js') querySql( 'select * from database', ( err, resutl) => { // do some thing })
在开发中我们只需要能够查询到数据库的数据就可以了,所以不用考虑数据库连接消耗的资源,一直开启一个连接使用就可以了,上面这种写法能够满足开发用。当然线上是不能这样写的,因为数据库每个连接有一个最大连接时间,约8个小时,时间过了就会自动断开连接,这样是肯定不行的,而且考虑到数据库一直处于连接状态会消耗大量资源,还可能导致内存泄漏,我们可以每次查询创建一个连接,使用完之后关闭。
在改造上面的代码之前我们先看看,这个代码里出现了callback,也就是回调函数。在我的上一篇文章里提到,遇到这种出现回调函数的情况,我们可以用promise来改造回调过程,避免可能出现的回调地狱,使用起来也更加的合理。
改造一下上面的querySql函数
const pool = mysql. createPool( MYSQL_CONF) pool. getConnection(( err, connetion) => { // connetion就是从连接池里拿到的连接 connection. query( "select * from table1", ( err, result) => { // do some thing }) // 注意这里不是连接end掉了,而是释放掉,归还回连接池里 connection. release() })
好的,连接池也会写了,之后封装成promise,再导出就完成了
// 创建mysql连接池 const pool = mysql. createPool( MYSQL_CONF) // 统一处理sql语句 function querySql( sql) { // 使用promise对象处理查询的数据 const promise = new Promise(( resolve, reject) => { // 从连接池里获取一个连接 pool. getConnection(( err, connection) => { if ( err) { reject( err) return } else { connection. query( sql, ( err, result) => { if ( err) { reject( err) return } else { resolve( result) } }) } // 释放本次连接 connection. release() }) }) return promise } module. exports = { querySql }
https://zhuanlan.zhihu.com/p/30172660
https://blog.csdn.net/bob_baobao/article/details/82260541