63 lines
2.4 KiB
TypeScript
63 lines
2.4 KiB
TypeScript
import { drizzle } from 'drizzle-orm/mysql2';
|
||
import { sql } from 'drizzle-orm';
|
||
import {createPool } from 'mysql2/promise';
|
||
import type { PoolOptions, Pool} from 'mysql2/promise';
|
||
import consola from "consola";
|
||
export default defineNitroPlugin(async nitroApp => {
|
||
|
||
const {mysql: config} = useRuntimeConfig()
|
||
consola.info('MySQL ...');
|
||
// 配置数据库
|
||
const poolOptions: PoolOptions = {
|
||
host: config.host,
|
||
port: config.port,
|
||
user: config.user,
|
||
password: config.password,
|
||
database: config.database,
|
||
// ssl: config.db.ssl,
|
||
waitForConnections: true,
|
||
connectionLimit: 10,
|
||
queueLimit: 0,
|
||
// 启用此选项后,MySQL驱动程序将支持大数字(big numbers),这对于存储和处理 bigint 类型的数据尤为重要。
|
||
// 如果不启用此选项,MySQL驱动程序可能无法正确处理超过 JavaScript 数字精度范围的大数值,导致数据精度丢失。
|
||
supportBigNumbers: true,
|
||
|
||
// 启用此选项后,MySQL驱动程序将在接收 bigint 或其他大数值时,将其作为字符串返回,而不是作为JavaScript数字。
|
||
// 这种处理方式可以避免JavaScript本身的数值精度限制问题,确保大数值在应用程序中保持精确。
|
||
bigNumberStrings: true,
|
||
|
||
// typeCast: function (field, next) {
|
||
// if (field.type === 'LONGLONG') { // 处理 BIGINT 类型
|
||
// return field.string(); // 强制转换为字符串
|
||
// }
|
||
// return next();
|
||
// }
|
||
}
|
||
let pool: Pool;
|
||
try{
|
||
pool = await createPool(poolOptions)
|
||
}catch (e) {
|
||
consola.error('MySQL onnection Error: ', e);
|
||
throw e;
|
||
}
|
||
// 暴露数据库
|
||
const db = drizzle(pool,{
|
||
logger: {
|
||
logQuery: (query, params) => {
|
||
console.log(`SQL: ${query} - Params: ${JSON.stringify(params, (_, v) =>
|
||
typeof v === 'bigint' ? v.toString() : v)}`); // 打印日志,包括查询和参数
|
||
}
|
||
}
|
||
});
|
||
const result = await db.execute(sql`SHOW TABLES`);
|
||
const tableList = result.map(row => Object.values(row)[0]);
|
||
consola.info('TableList', tableList.length)
|
||
// 将连接池添加到 Nitro 应用上下文
|
||
nitroApp.hooks.hook('request', async (event) => {
|
||
event.context.mysql = db
|
||
})
|
||
nitroApp.hooks.hook('error', async () => {
|
||
pool.end();
|
||
})
|
||
})
|