如何使用NodeJS + TypeORM调用MySQL存储过程?
NodeJS + TypeORM 调用MySQL存储过程实现指南
准备工作
- 安装必备依赖:
npm install typeorm mysql2 reflect-metadata - 配置TypeORM数据源(示例:
data-source.ts):import { DataSource } from "typeorm"; export const AppDataSource = new DataSource({ type: "mysql", host: "localhost", port: 3306, username: "your_db_user", password: "your_db_password", database: "your_database", synchronize: false, logging: false, entities: ["src/entities/**/*.ts"], migrations: ["src/migrations/**/*.ts"], subscribers: ["src/subscribers/**/*.ts"], }); - 初始化数据源:
await AppDataSource.initialize();
调用存储过程的常见场景
1. 无参数、无返回结果的存储过程
直接使用query方法执行CALL语句:
// 调用无参存储过程 await AppDataSource.query("CALL clean_expired_data()");
2. 带参数、无返回结果的存储过程
通过占位符?传递参数,第二个参数为参数数组:
// 调用带参数的存储过程(例:插入操作日志) await AppDataSource.query("CALL insert_operation_log(?, ?, ?)", [ "admin", "delete", new Date() ]);
3. 返回单个结果集的存储过程
query方法会返回结果数组,直接解构或遍历即可:
// 调用返回用户列表的存储过程(例:获取指定角色的用户) const [userList] = await AppDataSource.query("CALL get_users_by_role(?)", ["editor"]); console.log(userList); // 输出用户对象数组
4. 返回多个结果集的存储过程
存储过程返回多结果集时,query会返回一个包含多个数组的嵌套数组,每个子数组对应一个结果集:
// 调用返回多结果的存储过程 const [userData, orderData] = await AppDataSource.query("CALL get_user_with_orders(?)", [1]); console.log("用户信息:", userData); console.log("用户订单:", orderData);
5. 使用EntityManager调用
如果习惯用EntityManager操作,同样支持query方法:
const entityManager = AppDataSource.manager; const result = await entityManager.query("CALL get_user_count()"); console.log("用户总数:", result[0][0].count);
注意事项
- 确保MySQL中已正确创建目标存储过程,且数据库用户拥有执行权限
- 参数类型需与存储过程定义匹配(如日期类型直接传入
Date对象即可,TypeORM会自动处理转换) - 若项目使用TypeORM的实体映射,无需为存储过程返回结果创建实体,直接处理原始数据即可
- 应用关闭时记得销毁数据源连接:
await AppDataSource.destroy();
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

