TypeScript中Pool类型无法赋值给MYSQLDbWrapper接口的问题求助
解决MySQL Pool与自定义MYSQLDbWrapper接口类型不兼容的问题
问题根源
你定义的MYSQLDbWrapper接口要求query方法返回Promise<{ row: any[] }>,但mysql官方库的Pool.query返回的是Query对象(回调风格),并非Promise,因此TypeScript抛出类型不兼容错误。
解决方案:封装适配层
需要编写一个实现MYSQLDbWrapper接口的包装类,将原生mysql的回调式query转换为Promise,并统一返回格式:
1. 创建PoolWrapper类
import { Pool } from 'mysql'; import { MYSQLDbWrapper } from './sqldb-wrapper'; export class PoolWrapper implements MYSQLDbWrapper { private pool: Pool; constructor(pool: Pool) { this.pool = pool; } query(queryString: string, queryConf?: any[] | any): Promise<{ row: any[] }> { return new Promise((resolve, reject) => { this.pool.query(queryString, queryConf, (err, results) => { if (err) { reject(err); return; } // 统一处理查询结果:select返回数组,insert/update返回结果对象,都包装成row数组 resolve({ row: Array.isArray(results) ? results : [results] }); }); }); } }
2. 修改connMySql函数
用PoolWrapper包装原生Pool实例,再传入MYSQLUserDataSource:
async function connMySql() { const pool = mysql.createPool({ user: process.env.USER_MySql, host: process.env.HOST_MySql, database: process.env.DBNAME_MySql, password: process.env.PASSWORD_MySql, port: Number(process.env.PORT_MySql), }); const dbWrapper = new PoolWrapper(pool); return new MYSQLUserDataSource(dbWrapper); }
额外代码问题修正
你的代码中还有两处SQL语法错误,需要修复:
updateUser方法的SQL语句:jk字段缺少赋值符号,修正后:await this.db.query(`update ${DB_TABLE} set username = ?, tgl_lahir = ?, jk = ?, url_photo = ? where kode = ?`, [data?.username, data?.tgl_lahir, data?.jk, data?.url_photo, kode])deleteUser方法的SQL语句:缺少from关键字,修正后:await this.db.query(`delete from ${DB_TABLE} where kode = ?`, [kode])
内容的提问来源于stack exchange,提问作者Iqbal Ar
相关产品推荐
相关产品推荐

