如何通过MySQL Workbench从存储过程向NodeJS API返回JSON数据
将存储过程多结果集转换为指定JSON格式(Node.js)
你的问题核心是存储过程执行了两个SELECT语句,数据库驱动返回了包含两个结果集的数组,需要手动将其映射为你期望的键值对结构。以下是具体实现方案:
核心思路
存储过程返回的结果是一个二维数组:
- 第一个子数组对应
select * from category_details的查询结果 - 第二个子数组对应
select * from category_filters的查询结果
我们只需要将这两个子数组分别映射到目标对象的categoryDetails和categoryFilters字段即可。如果category_details返回的是单条数据,取子数组的第一个元素转为对象;如果是多条则直接使用子数组(根据你的预期格式,这里默认是单条)。
代码实现(以mysql2为例,支持Promise)
const mysql = require('mysql2/promise'); async function fetchCategoryInfo() { // 建立数据库连接 const conn = await mysql.createConnection({ host: '你的数据库地址', user: '用户名', password: '密码', database: '数据库名' }); try { // 调用存储过程 const [results] = await conn.execute('CALL 你的存储过程名()'); // 组装目标JSON结构 const formattedResponse = { categoryDetails: results[0][0], // 取第一个结果集的第一条数据(转为对象) categoryFilters: results[1] // 第二个结果集直接作为数组 }; return formattedResponse; } finally { // 关闭连接 await conn.end(); } } // 调用示例 fetchCategoryInfo() .then(res => console.log(JSON.stringify(res, null, 2))) .catch(err => console.error(err));
代码实现(以mysql模块为例,回调方式)
const mysql = require('mysql'); const conn = mysql.createConnection({ host: '你的数据库地址', user: '用户名', password: '密码', database: '数据库名', multipleStatements: true // 必须开启此选项以支持多结果集 }); conn.connect(err => { if (err) throw err; conn.query('CALL 你的存储过程名()', (queryErr, results) => { if (queryErr) throw queryErr; // 组装目标结构 const formattedResponse = { categoryDetails: results[0][0], categoryFilters: results[1] }; console.log(JSON.stringify(formattedResponse, null, 2)); conn.end(); }); });
注意事项
- 如果
category_details可能返回多条数据,将results[0][0]改为results[0]即可让categoryDetails成为数组 - 不同数据库驱动的结果集结构可能略有差异,比如部分驱动会返回包含
rows属性的对象,此时需要用results[0].rows替代results[0],具体参考驱动文档 - 确保存储过程没有返回额外的结果集(比如存储过程内部的计数语句),否则需要调整结果集的索引位置
内容的提问来源于stack exchange,提问作者Kalp Lathia
相关产品推荐
相关产品推荐

