前端自己寫介面,nuxt3一把梭之連線mysql

shellingfordly發表於2023-03-26

在 nuxt3 中連線 mysql

由於專案需要,根據前端的引數來連線不同的資料庫獲取資料,我本身是個前端,奈何沒有人給我寫介面,剛好最近也在看 nuxt3 的東西,就用 nuxt3 一把梭了。公司內部自用小專案,有問題慢慢改,順便學習一下。

安裝

  • 安裝 mysql2
pnpm i mysql2

程式碼

簡單封裝一下,根據 type 獲取資料庫連線字串,建立連線池,用 map 快取一下

import mysql from "mysql2/promise";

// 快取連線池
const poolMap = new Map<string, mysql.Pool>();

export async function useMysql(type: string): Promise<mysql.Pool | undefined> {
  // 獲取資料庫連線字串
  const uri = getServerMysqlUri(type);

  // 從快取中獲取連線池
  if (poolMap.has(type)) {
    const pool = poolMap.get(type);
    return pool;
  }

  try {
    const pool = await mysql.createPool(uri);

    // 快取
    poolMap.set(type, pool);

    return pool;
  } catch (error) {
    console.error("[Error]: mysql connection error.");
    return;
  }
}

看了一下網上別人寫的,發現他們有自己封裝一下 query 原始查詢的方法,我也仿寫了一個

大致就是最了一些錯誤攔截,查詢結束之後釋放了連線

function query(pool: mysql.Pool, sql: string) {
  return new Promise(async (resolve, reject) => {
    try {
      // 獲取連線
      const conn = await pool.getConnection();

      // 查詢
      await conn
        .query(sql)
        .then((result) => {
          resolve(result);
          // 釋放連線
          conn.release();
        })
        .catch((err) => {
          reject(err);
        });
    } catch (error) {
      reject(error);
    }
  });
}

我也不知道 mysql2 具體怎麼做的,需不需要釋放連線,大概看了一下網上別人寫的

監聽了一下請求的事件,發現釋放後的conn.threadId是同一個,不釋放時conn.threadId不一樣,大概是釋放之後能夠複用吧

db.on("acquire", function (connection) {
  console.log("Connection %d acquired", connection.threadId);
});

db.on("release", function (connection) {
  console.log("Connection %d released", connection.threadId);
});

// 在query方法裡獲取連線之後列印一下
const conn = await db.getConnection();
console.log("Connection %d connection", conn.threadId);
  • 結果如圖

2023-03-22-15-43-06.png

相關文章