koa2整合mysql


引入mysql包

npm install mysql

封裝mysql

創建mysql.js文件放在utils(工具包)中
使用pool連接池
mysql.js
//封裝mysql
const mysql = require('mysql')
let pools = {}//連接池
let query = (sql, callback, host = '127.0.0.1') => {
    if (!pools.hasOwnProperty(host)) {//是否存在連接池
        pools[host] = mysql.createPool({//不存在創建
            host: host,
            port: '3306',
            user: 'root',
            password: '',
            database: ''//數據庫名
        })
    }
    pools[host].getConnection((err, connection) => {//初始化連接池
        connection.query(sql, (err, results) => {//去數據庫查詢數據
            callback(err, results)//結果回調
            connection.release()//釋放連接資源 | 跟 connection.destroy() 不同,它是銷毀
        })
    })
}

module.exports = query

引入mysql.js

在app.js中
/*
 通過一個中間件,把所有的工具關聯起來
*/
app.use(async (ctx, next) => {
  //掛載到util中
  ctx.util = {
    mysql: require('./utils/mysql')
  }
  await next()
})

使用

// 操作數據庫
ctx.util.mysql('select * from test', function (err, results) {
    console.log(results);//返回的數據
    console.log(results[0].id);//獲取返回數據中的id([0]代表取第一條中的id)
})

不使用連接池

const mysql = require('mysql')

// 連接 mysql 服務器
const connection = mysql.createConnection({
    host: '127.0.0.1',
    port: '3306',
    user: 'root',
    password: '',
    database:''
})

// 執行SQL
connection.query(sql, function (err, result) {
  err // 錯誤信息
  result // 結果
})

// 銷毀連接 | 由於 JS 是異步的,所以當前代碼會在執行 SQL 之前就銷毀了連接
connection.destroy()

尾聲

用 createConnection 創建 Mysql 連接,每執行一次 connection.query 都是一個全新的連接,會造成一個資源的極大浪費,降低性能。
連接池是另外的一種執行方法,它一次性的創建了多個連接,然后根據客戶端的查詢,自動的 分發、復用、管理 這些連接。
引用至https://www.jmjc.tech/less/113
項目使用中發現還可以繼續封裝,如下

以上寫法返回給前端需套在Promise中

為了少寫代碼,再次封裝
//封裝mysql
const mysql = require('mysql')
let pools = {}//連接池
let query = (sql, host = '127.0.0.1') => {
    if (!pools.hasOwnProperty(host)) {//是否存在連接池
        pools[host] = mysql.createPool({//不存在創建
            host: host,
            port: '3306',
            user: 'root',
            password: 'mysqlroot',
            database: 'blog'
        })
    }
    return new Promise((resolve, reject) => {
        pools[host].getConnection((err, connection) => {//初始化連接池
            if (err) console.log(err,'數據庫連接失敗');
            else connection.query(sql, (err, results) => {//去數據庫查詢數據
                connection.release()//釋放連接資源
                if (err) reject(err);
                else resolve(results);
            })
        })
    })
}

module.exports = query

app.js中引用 上面有

使用

router.get('/', async (ctx, next) => {
  await ctx.util.mysql(`select * from test`).then((res) => {
    console.log(res);
    ctx.body = res;//返回給前端的數據
  })
  await next()
})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM