You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:10:21