如何在TypeScript中调用MySQL存储过程并返回普通对象数组
TypeScript 直连MySQL调用存储过程实现方案
前置依赖安装
无需引入任何ORM包,直接使用维护活跃度更高的mysql2驱动即可,API完全兼容你原有写的mysql驱动逻辑,同时内置完整TypeScript类型支持:
- 安装核心驱动:
npm install mysql2 - 安装基础类型依赖:
npm install -D @types/node
可直接运行的TypeScript实现代码
推荐写法(Async/Await 风格)
import mysql, { RowDataPacket } from 'mysql2/promise'; // 初始化数据库连接 const connection = await mysql.createConnection({ host: '127.0.0.1', // 替换为你的数据库地址 user: 'root', // 替换为你的数据库账号 password: 'your_password', // 替换为你的数据库密码 database: 'your_db_name', // 替换为你的目标库名 // 以下配置为直接返回普通对象、跳过额外格式转换的核心参数 decimalNumbers: true, supportBigNumbers: true, dateStrings: false, rowsAsArray: false }); // 定义存储过程返回的数据结构,字段和存储过程返回列一一对应即可 interface MIJobFilterItem extends RowDataPacket { id: string; // 其余业务字段按实际返回列补充定义 } // 调用存储过程,使用?占位符传参避免SQL注入,不要直接拼接参数到SQL字符串 const [queryResults] = await connection.query<MIJobFilterItem[][]>( 'CALL spMIJobFilter_lst(?)', ['4261ebf7-614c-4b6c-9dff-39044a048b26'] ); // 存储过程默认返回嵌套数组,取第一个元素就是目标数据集 const resultList = queryResults[0]; resultList.forEach(item => { console.log(item); // 此处item即为原生普通JS对象,无JSON序列化转换环节 }); // 操作完成后关闭连接 await connection.end();
兼容原有逻辑的回调风格写法
如果你要保持原代码的回调写法,不需要改异步逻辑,可直接用以下版本:
import mysql, { RowDataPacket } from 'mysql2'; const connection = mysql.createConnection({ host: '127.0.0.1', user: 'root', password: 'your_password', database: 'your_db_name', decimalNumbers: true, supportBigNumbers: true, dateStrings: false, rowsAsArray: false }); interface MIJobFilterItem extends RowDataPacket { id: string; } connection.query<MIJobFilterItem[][]>( 'CALL spMIJobFilter_lst(?)', ['4261ebf7-614c-4b6c-9dff-39044a048b26'], (error, results) => { if (error) throw error; const resultList = results[0]; resultList.forEach(result => { console.log(result); }); connection.end(); } );
返回普通对象数组的配置说明
你感知到的“自动转JSON”本质是老版mysql驱动默认对Decimal、Date、BigInt等特殊类型做了字符串格式化处理,并不是真的做了JSON序列化。只要在创建连接时加上前文列出的4个配置项,驱动就会直接返回对应JS原生类型的普通对象数组,不需要额外做JSON反序列化处理,拿到结果可以直接在业务逻辑中使用。
注意:不要把参数直接拼接进CALL语句,统一用
?占位符传参,驱动会自动做特殊字符转义,从根源避免SQL注入风险。存储过程的返回结果默认多嵌套一层数组,取索引为0的元素即可拿到目标查询集。
内容的提问来源于stack exchange,提问作者spacedog
相关产品推荐
相关产品推荐

