@sch_cat/export-utils 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,128 +1,140 @@
1
- ## 📦 @sch_cat/export-utils
2
- ###### 一个轻量级、高性能的 Node.js 数据导出工具,支持 MySQL MongoDB,可将海量数据流式导出为 CSV 文件,并实时跟踪任务进度。
1
+ ## 📤 ExportUtils — 高性能 MySQL / MongoDB 数据导出工具
2
+ ###### 一个支持 流式导出、大表处理、进度追踪 和 自动压缩 的 Node.js 导出工具,适用于将 MySQL MongoDB 数据高效导出为 CSV(GZIP 压缩)。
3
3
  ![npm version](https://img.shields.io/npm/v/@sch_cat/export-utils?color=green)
4
4
  ![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)
5
5
 
6
6
  ##### ✨ 特性
7
- 流式导出 – 支持百万级数据导出,避免内存溢出(OOM)。
8
- 双数据库支持 原生支持 MySQL 和 MongoDB 表/集合导出。
9
- 实时进度追踪 – 通过 Redis 存储任务状态(键名:export:taskId)。
10
- 字段格式化 – 自定义 CSV 中字段的显示格式(如状态转换、日期格式等)。
11
- Gzip 压缩输出 生成 .csv.gz 文件,节省磁盘与带宽。
12
- TypeScript 友好 – 内置完整类型定义。
13
- 背压控制 – 自动暂停/恢复数据流,防止内存堆积。
7
+ 流式导出:内存占用低,支持百万级数据导出
8
+ 自动 GZIP 压缩:输出 .csv.gz 文件,节省磁盘与带宽
9
+ 实时进度追踪:通过 Redis 存储任务状态(支持查询)
10
+ 字段格式化:支持自定义列 formatter(如时间格式转换)
11
+ 安全防护:表名/字段名校验(防 SQL 注入)Raw SQL 白名单限制(仅允许简单 SELECT)
12
+ 背压控制:自动 pause/resume 流,防止内存溢出
13
+ 连接池管理:MySQL 使用连接池,确保高并发安全
14
14
 
15
15
  ##### 🚀 安装
16
16
  ```
17
17
  npm install @sch_cat/export-utils
18
18
  ```
19
19
 
20
- ##### 📖 使用示例
21
- 1. 初始化导出工具
20
+ ##### 🔧 初始化
22
21
  ```
23
- // export.service.ts
24
- import { ExportUtils } from '@sch_cat/export-utils';
22
+ import { ExportUtils } from './src/index.js';
25
23
 
26
- const exportUtils = new ExportUtils({
24
+ const exporter = new ExportUtils({
27
25
  redisOptions: {
28
- host: 'localhost',
26
+ host: '127.0.0.1',
29
27
  port: 6379,
28
+ // 其他 ioredis 配置...
30
29
  },
31
30
  mysqlOptions: {
32
31
  host: 'localhost',
33
32
  user: 'root',
34
33
  password: 'password',
35
34
  database: 'mydb',
35
+ connectionLimit: 10,
36
+ // 其他 mysql2.PoolOptions...
36
37
  },
37
38
  mongoOptions: {
38
39
  url: 'mongodb://localhost:27017',
39
- options: { useNewUrlParser: true, useUnifiedTopology: true },
40
- },
40
+ options: {
41
+ // MongoClientOptions
42
+ }
43
+ }
41
44
  });
42
45
  ```
43
46
  > 💡 如果只使用一种数据库,可省略另一项配置(如仅用 MySQL,则无需 mongoOptions)。
44
- 2. 从 MySQL 导出数据
47
+
48
+ 🚀 使用示例
49
+ 1. 导出 MySQL 表
45
50
  ```
46
- const taskId = await exportUtils.createMysqlExportTask({
47
- table: 'users', // 表名(自动校验安全性)
48
- outputPath: 'exports/users.csv', // 相对路径或绝对路径
51
+ const taskId = await exporter.createMysqlExportTask({
52
+ table: 'users',
53
+ outputPath: 'users',
49
54
  columns: [
50
- { key: 'id', header: '用户ID' },
51
- { key: 'name' }, // header 默认为 key
52
- {
53
- key: 'status',
54
- header: '状态',
55
- formatter: (val) => (val === 1 ? '启用' : '禁用'), // 自定义格式
56
- },
55
+ { key: 'id' },
56
+ { key: 'name', header: '姓名' },
57
+ { key: 'created_at', formatter: (v) => new Date(v).toISOString() }
57
58
  ],
58
- where: 'created_at > "2024-01-01"', // 可选 SQL WHERE 条件
59
- batchSize: 2000, // 每批处理行数
60
- onCompleted: (result) => {
61
- console.log('✅ 导出完成:', result.outputPath);
62
- },
63
- onErr: (err) => {
64
- console.error('❌ 导出失败:', err.errMsg);
59
+ where: "status = 'active'",
60
+ onCompleted: ({ taskId, rowCount, outputPath }) => {
61
+ console.log(`✅ 任务 $ {taskId} 完成,共 $ {rowCount} 行,文件: $ {outputPath}`);
65
62
  },
63
+ onErr: ({ errMsg }) => {
64
+ console.error('❌ 导出失败:', errMsg);
65
+ }
66
66
  });
67
67
 
68
- console.log('任务ID:', taskId); // 例如:export-mysql-csv-xxxx
68
+ console.log('任务ID:', taskId);
69
69
  ```
70
- 3. MongoDB 导出数据
70
+ 2. 使用 Raw SQL
71
71
  ```
72
- const taskId = await exportUtils.createMongoExportTask({
72
+ const taskId = await exporter.createMysqlExportTask({
73
+ rawSql: 'SELECT id, email FROM users WHERE created_at > "2024-01-01"',
74
+ outputPath: 'active_users',
75
+ // ...其他配置
76
+ });
77
+ ```
78
+ > 🔒 rawSql 必须是 简单 SELECT 语句,禁止包含 ;、DROP、UPDATE 等危险操作。
79
+ 3. 导出 MongoDB 集合
80
+ ```
81
+ const taskId = await exporter.createMongoExportTask({
73
82
  db: 'myapp',
74
83
  collection: 'orders',
75
- outputPath: 'exports/orders.csv',
84
+ outputPath: 'orders.csv',
85
+ query: { status: 'paid' },
76
86
  columns: [
77
- { key: '_id', header: '订单ID' },
78
- { key: 'amount' },
79
- { key: 'user.email', header: '邮箱' }, // 支持嵌套字段
87
+ { key: '_id' },
88
+ { key: 'amount', header: '金额' },
89
+ { key: 'createdAt' }
80
90
  ],
81
- query: { status: 'completed' }, // MongoDB 查询条件
82
- batchSize: 1000,
83
- onCompleted: (result) => {
84
- console.log('✅ 导出完成:', result.outputPath);
85
- },
86
- onErr: (err) => {
87
- console.error('❌ 导出失败:', err.errMsg);
88
- },
91
+ onCompleted: ({ outputPath, rowCount }) => {
92
+ console.log(`📦 导出完成: $ {outputPath} ( $ {rowCount} 行)`);
93
+ }
89
94
  });
90
95
  ```
91
- 4. 查询任务进度
96
+ > 💡 进度信息存储在 Redis 中,有效期为 1 小时(TTL = 3600 秒)。
97
+ 4. 查询任务状态
92
98
  ```
93
- const statuses = await exportUtils.getTaskStatus({
94
- taskIdList: ['export-mysql-csv-xxxx', 'export-mongo-csv-yyyy'],
99
+ const statuses = await exporter.getTaskStatus({
100
+ taskIdList: [taskId]
95
101
  });
96
102
 
97
- console.log(statuses);
98
- // [
99
- // {
100
- // taskId: 'export-mysql-csv-xxxx',
101
- // total: 10000,
102
- // current: 5230,
103
- // progress: '52.30%',
104
- // status: 'RUNNING'
105
- // },
106
- // ...
107
- // ]
103
+ console.log(statuses[0]);
104
+ // 输出示例:
105
+ // {
106
+ // taskId: 'export-mysql-csv-xxx',
107
+ // total: 10000,
108
+ // current: 8500,
109
+ // progress: '85.00%',
110
+ // status: 'RUNNING'
111
+ // }
108
112
  ```
109
- > 💡 进度信息存储在 Redis 中,有效期为 1 小时(TTL = 3600 秒)。
110
-
111
- ##### 📂 输出文件说明
112
- - 所有导出文件均为 .csv.gz 格式(gzip 压缩的 CSV)。
113
- - 示例:exports/users.csv → 实际生成 exports/users.csv.gz
114
- - CSV 文件特性:
115
- - 包含 UTF-8 BOM(确保 Excel 正确识别中文)
116
- - 自动对包含 ,、"、换行符的字段加引号
113
+ ##### 📂 输出文件
114
+ - 所有文件默认保存在 ./exports/ 目录(可被 outputPath 覆盖)
115
+ - 文件名自动追加 .csv.gz 后缀(如 users → users.csv.gz)
116
+ - 支持绝对路径:/data/backups/users.csv
117
117
 
118
118
  ##### 🛠 配置选项
119
119
  > ExportUtilsOptions
120
120
 
121
- |参数|类型|必填|说明
122
- |-----|-----|-----|-----|
123
- redisOptions|RedisOptions|✅|ioredis 配置
124
- mysqlOptions|mysql2.ConnectionOptions|❌|仅 MySQL 导出时需要
125
- mongoOptions|{ url: string; options?: MongoClientOptions }|❌|仅 MongoDB 导出时需要
121
+ | 字段 | 类型 | 必填 | 说明 |
122
+ |------|------|------|------|
123
+ | `redisOptions` | `RedisOptions` | ✅ | ioredis 连接配置 |
124
+ | `mysqlOptions` | `PoolOptions` | ❌ | mysql2 连接池配置 |
125
+ | `mongoOptions` | `{ url: string; options?: MongoClientOptions }` | ❌ | MongoDB 连接配置 |
126
+
127
+ > ExportMysqlOptions / ExportMongoOptions
128
+
129
+ | 字段 | 说明 |
130
+ |------|------|
131
+ | `outputPath` | 输出路径(必填) |
132
+ | `columns` | 指定导出列及格式化函数 |
133
+ | `onCompleted` / `onErr` | 回调钩子 |
134
+ | MySQL 独有:`table`, `where`, `rawSql` | 三选一(优先 `rawSql`) |
135
+ | MongoDB 独有:`db`, `query` | |
136
+
137
+
126
138
 
127
139
  > 字段定义(columns)
128
140
  ```
@@ -147,9 +159,17 @@ npm run dev:mongo
147
159
  ##### 📜 开源协议
148
160
  MIT © 501241320@qq.com
149
161
 
150
- ##### 🙌 注意事项
151
- - 所有表名和字段名均经过安全校验(仅允许字母、数字、下划线),防止 SQL 注入。
152
- - 生产环境中建议:
153
- - Redis 持久化任务状态,或自行实现任务恢复机制;
154
- - 控制并发导出任务数量,避免数据库压力过大。
155
- ##### 💡 小技巧:可使用 gunzip/7zip 解压 .csv.gz 文件,或在 Excel 中通过「数据」→「从文本/CSV」直接导入。
162
+ ##### ⚠️ 注意事项
163
+ 1. Raw SQL 安全限制
164
+ rawSql 必须满足:
165
+ - SELECT 开头
166
+ - 不包含 ;
167
+ - 不包含 DROP / DELETE / UPDATE / INSERT 等关键字
168
+ 2. MySQL 连接释放
169
+ - 每个导出任务会从连接池获取一个连接,并在完成后自动释放,无需手动管理。
170
+ 3. Redis 用途
171
+ - 仅用于存储任务进度,不参与核心导出逻辑。Redis 断开不影响导出,但无法查询进度。
172
+ 4. 大表建议
173
+ - 避免 SELECT *,明确指定字段
174
+ - 添加索引到 WHERE 条件字段
175
+ - 监控磁盘空间(GZIP 仍需临时写入)
package/dist/index.d.ts CHANGED
@@ -1,16 +1,19 @@
1
1
  import { type ExportMongoOptions, type ExportMysqlOptions, type ExportUtilsOptions, type TaskProcessInput, type TaskProcessResult } from './types.js';
2
2
  export declare class ExportUtils {
3
3
  private redisClient;
4
- private mysqlClient;
5
4
  private mongoClient;
6
5
  private readonly options;
7
6
  private readonly DEFAULT_EXPORT_DIR;
8
7
  private readonly TASK_OUT_TIME;
8
+ private readonly UPDATE_INTERVAL_MS;
9
+ private readonly BATCH_SIZE;
10
+ private getConnectionAsync;
9
11
  constructor(options: ExportUtilsOptions);
10
12
  private redisInit;
11
13
  private mysqlInit;
12
14
  private mongoInit;
13
15
  private processUpdate;
16
+ private queryCallback;
14
17
  createMysqlExportTask(params: ExportMysqlOptions): Promise<string>;
15
18
  private exportMysqlToCsv;
16
19
  createMongoExportTask(params: ExportMongoOptions): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAEH,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EAEvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACzB,MAAM,YAAY,CAAC;AAGpB,qBAAa,WAAW;IACpB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;gBAE1B,OAAO,EAAE,kBAAkB;YAKzB,SAAS;YAMT,SAAS;YAST,SAAS;YAcT,aAAa;IAsBrB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;YA4B1D,gBAAgB;IAiHxB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;YA4B1D,gBAAgB;IA6GxB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,iBAAiB,GAAG,EAAE,CAAC,EAAE,CAAC;CAYrF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAEH,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EAEvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACzB,MAAM,YAAY,CAAC;AAGpB,qBAAa,WAAW;IACpB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IAEnC,OAAO,CAAC,kBAAkB,CAA2C;gBAEzD,OAAO,EAAE,kBAAkB;YAKzB,SAAS;YAST,SAAS;YAUT,SAAS;YAcT,aAAa;IAqB3B,OAAO,CAAC,aAAa;IAUf,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;YAoC1D,gBAAgB;IA4HxB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;YA4B1D,gBAAgB;IA8GxB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,iBAAiB,GAAG,EAAE,CAAC,EAAE,CAAC;CAYrF"}
package/dist/index.js CHANGED
@@ -5,17 +5,20 @@ import { Redis } from 'ioredis';
5
5
  import { MongoClient } from 'mongodb';
6
6
  import mysql, {} from 'mysql2';
7
7
  import { dirname, isAbsolute, join } from 'path';
8
+ import { promisify } from 'util';
8
9
  import { v4 as uuidv4 } from 'uuid';
9
10
  import zlib from 'zlib';
10
11
  import { ProcessStatus, } from './types.js';
11
- import { isValidIdentifier } from './utils/tools.js';
12
+ import { isSafeRawSql, isValidIdentifier } from './utils/tools.js';
12
13
  export class ExportUtils {
13
14
  redisClient;
14
- mysqlClient;
15
15
  mongoClient;
16
16
  options;
17
17
  DEFAULT_EXPORT_DIR = 'exports'; //默认导出目录
18
18
  TASK_OUT_TIME = 3600; //任务超时时间
19
+ UPDATE_INTERVAL_MS = 2000; //2s更新一次状态
20
+ BATCH_SIZE = 1000; //mongodb导出数据一批数量
21
+ getConnectionAsync;
19
22
  constructor(options) {
20
23
  this.options = options;
21
24
  }
@@ -23,6 +26,9 @@ export class ExportUtils {
23
26
  async redisInit() {
24
27
  const { redisOptions } = this.options;
25
28
  this.redisClient = new Redis(redisOptions);
29
+ this.redisClient.on('error', err => {
30
+ console.error('Redis connection error:', err);
31
+ });
26
32
  }
27
33
  //mysql初始化
28
34
  async mysqlInit() {
@@ -30,7 +36,8 @@ export class ExportUtils {
30
36
  if (!mysqlOptions) {
31
37
  throw new Error('缺少mysql配置信息');
32
38
  }
33
- this.mysqlClient = mysql.createConnection(mysqlOptions);
39
+ const pool = mysql.createPool(mysqlOptions);
40
+ this.getConnectionAsync = promisify(pool.getConnection.bind(pool));
34
41
  }
35
42
  //mongo初始化
36
43
  async mongoInit() {
@@ -56,7 +63,6 @@ export class ExportUtils {
56
63
  progressPercent = '0.00%';
57
64
  total = -1;
58
65
  current = -1;
59
- errMsg;
60
66
  }
61
67
  const updates = {
62
68
  taskId,
@@ -67,17 +73,28 @@ export class ExportUtils {
67
73
  };
68
74
  this.redisClient.set(`export:${taskId}`, JSON.stringify(updates), 'EX', this.TASK_OUT_TIME);
69
75
  }
76
+ // 转换mysql连接为promise风格
77
+ queryCallback(connection, sql) {
78
+ return new Promise((resolve, reject) => {
79
+ connection.query(sql, (err, results) => {
80
+ if (err)
81
+ reject(err);
82
+ else
83
+ resolve(results);
84
+ });
85
+ });
86
+ }
70
87
  //创建导出mysql任务
71
88
  async createMysqlExportTask(params) {
72
89
  if (!this.redisClient) {
73
90
  await this.redisInit();
74
91
  }
75
- if (!this.mysqlClient) {
92
+ if (!this.getConnectionAsync) {
76
93
  await this.mysqlInit();
77
94
  }
78
- const { table, columns = [] } = params;
95
+ const { table, columns = [], rawSql } = params;
79
96
  //参数校验
80
- if (!isValidIdentifier(table)) {
97
+ if (table && !isValidIdentifier(table)) {
81
98
  throw new Error('Invalid table name');
82
99
  }
83
100
  if (columns.length) {
@@ -87,23 +104,33 @@ export class ExportUtils {
87
104
  }
88
105
  }
89
106
  }
107
+ if (rawSql && !isSafeRawSql(rawSql)) {
108
+ throw new Error('Unsafe raw SQL detected. Only simple SELECT statements without ; or DDL/DML are allowed.');
109
+ }
90
110
  //任务ID
91
111
  const taskId = `export-mysql-csv-${uuidv4()}`;
92
- this.exportMysqlToCsv(taskId, params);
112
+ //获取连接
113
+ const connection = await this.getConnectionAsync();
114
+ this.exportMysqlToCsv(taskId, connection, params).finally(() => {
115
+ connection.release();
116
+ });
93
117
  return taskId;
94
118
  }
95
119
  //mysql导出
96
- async exportMysqlToCsv(taskId, params) {
97
- const { table, outputPath, columns = [], where = '', batchSize = 1000, onCompleted, onErr } = params;
120
+ async exportMysqlToCsv(taskId, connection, params) {
121
+ const { table, outputPath, columns = [], where = '', rawSql = '', onCompleted, onErr } = params;
98
122
  // 路径处理
99
123
  const finalOutputPath = isAbsolute(outputPath)
100
124
  ? outputPath
101
125
  : join(process.cwd(), this.DEFAULT_EXPORT_DIR, outputPath);
102
126
  mkdirSync(dirname(finalOutputPath), { recursive: true });
103
127
  // 初始化进度
104
- const countQuery = `SELECT COUNT(*) AS total FROM \`${table}\`` + (where.trim() ? ` WHERE ${where.trim()}` : '');
105
- const [countRows] = await this.mysqlClient.promise().query(countQuery);
128
+ const countQuery = rawSql
129
+ ? `SELECT COUNT(*) AS total FROM (${rawSql}) AS __count_alias`
130
+ : `SELECT COUNT(*) AS total FROM \`${table}\`` + (where.trim() ? ` WHERE ${where.trim()}` : '');
131
+ const countRows = await this.queryCallback(connection, countQuery);
106
132
  const totalRows = countRows[0].total;
133
+ console.log('查询总数:', totalRows);
107
134
  // 写入初始状态到 Redis
108
135
  this.processUpdate({ taskId, current: 0, total: totalRows });
109
136
  // 创建 CSV 写入流
@@ -125,9 +152,11 @@ export class ExportUtils {
125
152
  csvStream.pipe(gzip).pipe(fileStream);
126
153
  // 构建 SQL 查询
127
154
  const columnList = !columns.length ? '*' : columns.map(col => `\`${col.key}\``).join(', ');
128
- const query = `SELECT ${columnList} FROM \`${table}\`` + (where.trim() ? ` WHERE ${where.trim()}` : '');
155
+ const query = rawSql
156
+ ? rawSql
157
+ : `SELECT ${columnList} FROM \`${table}\`` + (where.trim() ? ` WHERE ${where.trim()}` : '');
129
158
  // 使用流式查询
130
- const stream = this.mysqlClient.query(query).stream();
159
+ const stream = connection.query(query).stream();
131
160
  // 处理背压
132
161
  let shouldPause = false;
133
162
  let rowCount = 0;
@@ -142,12 +171,12 @@ export class ExportUtils {
142
171
  errMsg: error.message,
143
172
  });
144
173
  }
145
- this.mysqlClient.end();
146
174
  };
147
- this.mysqlClient.on('error', err => handleError(err, 'MySQL connection error'));
175
+ connection.on('error', err => handleError(err, 'MySQL connection error'));
148
176
  stream.on('error', err => handleError(err, 'MySQL query error'));
149
177
  csvStream.on('error', err => handleError(err, 'CSV stream error'));
150
178
  fileStream.on('error', err => handleError(err, 'File write error'));
179
+ let lastUpdateAt = Date.now();
151
180
  stream.on('data', (row) => {
152
181
  rowCount++;
153
182
  let outputRow = {};
@@ -161,10 +190,12 @@ export class ExportUtils {
161
190
  shouldPause = true;
162
191
  stream.pause();
163
192
  }
164
- // 📈 每 batch 更新进度
165
- if (rowCount % batchSize === 0 || rowCount === totalRows) {
193
+ // 📈 每 UPDATE_INTERVAL_MS 更新进度
194
+ const now = Date.now();
195
+ if (rowCount === totalRows || now - lastUpdateAt >= this.UPDATE_INTERVAL_MS) {
166
196
  console.log(`process:${rowCount}/${totalRows}`);
167
197
  this.processUpdate({ taskId, current: rowCount, total: totalRows });
198
+ lastUpdateAt = now;
168
199
  }
169
200
  });
170
201
  stream.on('end', () => {
@@ -215,7 +246,7 @@ export class ExportUtils {
215
246
  }
216
247
  //mongo导出
217
248
  async exportMongoToCsv(taskId, params) {
218
- const { collection, db, outputPath, columns = [], query = {}, batchSize = 1000, onCompleted, onErr } = params;
249
+ const { collection, db, outputPath, columns = [], query = {}, onCompleted, onErr } = params;
219
250
  // 路径处理
220
251
  const finalOutputPath = isAbsolute(outputPath)
221
252
  ? outputPath
@@ -248,7 +279,7 @@ export class ExportUtils {
248
279
  let shouldPause = false;
249
280
  let rowCount = 0;
250
281
  // 创建 MongoDB 游标(流式读取)
251
- const cursor = collectionClient.find(query).batchSize(batchSize).stream();
282
+ const cursor = collectionClient.find(query).batchSize(this.BATCH_SIZE).stream();
252
283
  // 错误处理(防止静默失败)
253
284
  const handleError = (error, context) => {
254
285
  console.error(`❌ ${context}:`, error.message);
@@ -260,12 +291,11 @@ export class ExportUtils {
260
291
  errMsg: error.message,
261
292
  });
262
293
  }
263
- this.mysqlClient.end();
264
294
  };
265
- this.mongoClient.on('error', err => handleError(err, 'mongo connection error'));
266
295
  cursor.on('error', err => handleError(err, 'mongo query error'));
267
296
  csvStream.on('error', err => handleError(err, 'CSV stream error'));
268
297
  fileStream.on('error', err => handleError(err, 'File write error'));
298
+ let lastUpdateAt = Date.now();
269
299
  cursor.on('data', (row) => {
270
300
  rowCount++;
271
301
  let outputRow = {};
@@ -280,9 +310,11 @@ export class ExportUtils {
280
310
  cursor.pause();
281
311
  }
282
312
  // 📈 每 batch 更新进度
283
- if (rowCount % batchSize === 0 || rowCount === totalRows) {
313
+ const now = Date.now();
314
+ if (rowCount === totalRows || now - lastUpdateAt >= this.UPDATE_INTERVAL_MS) {
284
315
  console.log(`process:${rowCount}/${totalRows}`);
285
316
  this.processUpdate({ taskId, current: rowCount, total: totalRows });
317
+ lastUpdateAt = now;
286
318
  }
287
319
  });
288
320
  cursor.on('end', () => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AAEf,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,EAAmB,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EACH,aAAa,GAOhB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,OAAO,WAAW;IACZ,WAAW,CAAS;IACpB,WAAW,CAAc;IACzB,WAAW,CAAe;IACjB,OAAO,CAAqB;IAC5B,kBAAkB,GAAG,SAAS,CAAC,CAAC,QAAQ;IACxC,aAAa,GAAG,IAAI,CAAC,CAAC,QAAQ;IAE/C,YAAY,OAA2B;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,UAAU;IACF,KAAK,CAAC,SAAS;QACnB,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IAED,UAAU;IACF,KAAK,CAAC,SAAS;QACnB,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC;IAED,UAAU;IACF,KAAK,CAAC,SAAS;QACnB,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;QACtC,IAAI,CAAC;YACD,IAAI,CAAC,WAAW,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAED,MAAM;IACE,KAAK,CAAC,aAAa,CAAC,MAA2B;QACnD,IAAI,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAC1D,IAAI,eAAe,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QACvF,IAAI,MAAM,GAAG,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC;QAChF,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;YAC9B,eAAe,GAAG,OAAO,CAAC;YAC1B,KAAK,GAAG,CAAC,CAAC,CAAC;YACX,OAAO,GAAG,CAAC,CAAC,CAAC;YACb,MAAM,CAAC;QACX,CAAC;QACD,MAAM,OAAO,GAAwB;YACjC,MAAM;YACN,KAAK;YACL,OAAO;YACP,QAAQ,EAAE,eAAe;YACzB,MAAM;SACT,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,MAAM,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAChG,CAAC;IAED,aAAa;IACb,KAAK,CAAC,qBAAqB,CAAC,MAA0B;QAClD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;QAEvC,MAAM;QACN,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;gBACxD,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM;QACN,MAAM,MAAM,GAAG,oBAAoB,MAAM,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,SAAS;IACD,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,MAA0B;QACrE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QACrG,OAAO;QACP,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,CAAC;YAC1C,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;QAC/D,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,QAAQ;QACR,MAAM,UAAU,GACZ,mCAAmC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnG,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvE,MAAM,SAAS,GAAI,SAAiB,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC;QAExD,gBAAgB;QAChB,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAE7D,aAAa;QACb,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACnC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,SAAS,CAAC;YACxB,MAAM,EAAE,IAAI,EAAE,OAAO;YACrB,SAAS,EAAE,GAAG,EAAE,MAAM;YACtB,MAAM,EAAE,KAAK,EAAE,SAAS;YACxB,YAAY,EAAE,WAAW,EAAE,iBAAiB;YAC5C,MAAM,EAAE,GAAG,EAAE,OAAO;YACpB,GAAG,EAAE,IAAI,EAAE,6BAA6B;YACxC,GAAG,CAAC,YAAY,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,mBAAmB;SAC7E,CAAC,CAAC;QAEH,UAAU;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,eAAe,SAAS,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEtC,YAAY;QACZ,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3F,MAAM,KAAK,GAAG,UAAU,UAAU,WAAW,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEzG,SAAS;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAEtD,OAAO;QACP,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,eAAe;QACf,MAAM,WAAW,GAAG,CAAC,KAAY,EAAE,OAAe,EAAE,EAAE;YAClD,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACtD,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,CAAC;oBACF,MAAM;oBACN,MAAM,EAAE,aAAa,CAAC,MAAM;oBAC5B,MAAM,EAAE,KAAK,CAAC,OAAO;iBACxB,CAAC,CAAC;YACP,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;QAC3B,CAAC,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACjE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACnE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAEpE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAQ,EAAE,EAAE;YAC3B,QAAQ,EAAE,CAAC;YAEX,IAAI,SAAS,GAAQ,EAAE,CAAC;YACxB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC9B,MAAM,cAAc,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC1E,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;YACxC,CAAC;YAED,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACtE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,WAAW,GAAG,IAAI,CAAC;gBACnB,MAAM,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YAED,kBAAkB;YAClB,IAAI,QAAQ,GAAG,SAAS,KAAK,CAAC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;gBAChD,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACxE,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAClB,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,cAAc;QACnC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,IAAI,WAAW,EAAE,CAAC;gBACd,WAAW,GAAG,KAAK,CAAC;gBACpB,MAAM,CAAC,MAAM,EAAE,CAAC;YACpB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,IAAI,WAAW,EAAE,CAAC;gBACd,WAAW,CAAC;oBACR,MAAM;oBACN,QAAQ;oBACR,UAAU,EAAE,GAAG,eAAe,SAAS;oBACvC,MAAM,EAAE,aAAa,CAAC,SAAS;iBAClC,CAAC,CAAC;YACP,CAAC;YACD,gEAAgE;QACpE,CAAC,CAAC,CAAC;IACP,CAAC;IAED,aAAa;IACb,KAAK,CAAC,qBAAqB,CAAC,MAA0B;QAClD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;QAE5C,MAAM;QACN,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;gBACxD,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM;QACN,MAAM,MAAM,GAAG,oBAAoB,MAAM,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,SAAS;IACD,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,MAA0B;QACrE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QAC9G,OAAO;QACP,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,CAAC;YAC1C,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;QAC/D,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,OAAO;QACP,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAExE,QAAQ;QACR,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE/D,gBAAgB;QAChB,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAE7D,aAAa;QACb,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACnC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,SAAS,CAAC;YACxB,MAAM,EAAE,IAAI,EAAE,OAAO;YACrB,SAAS,EAAE,GAAG,EAAE,MAAM;YACtB,MAAM,EAAE,KAAK,EAAE,SAAS;YACxB,YAAY,EAAE,WAAW,EAAE,iBAAiB;YAC5C,MAAM,EAAE,GAAG,EAAE,OAAO;YACpB,GAAG,EAAE,IAAI,EAAE,6BAA6B;YACxC,GAAG,CAAC,YAAY,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,mBAAmB;SAC7E,CAAC,CAAC;QAEH,UAAU;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,eAAe,SAAS,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEtC,OAAO;QACP,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,sBAAsB;QACtB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;QAE1E,eAAe;QACf,MAAM,WAAW,GAAG,CAAC,KAAY,EAAE,OAAe,EAAE,EAAE;YAClD,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACtD,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,CAAC;oBACF,MAAM;oBACN,MAAM,EAAE,aAAa,CAAC,MAAM;oBAC5B,MAAM,EAAE,KAAK,CAAC,OAAO;iBACxB,CAAC,CAAC;YACP,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;QAC3B,CAAC,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACjE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACnE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAEpE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAQ,EAAE,EAAE;YAC3B,QAAQ,EAAE,CAAC;YAEX,IAAI,SAAS,GAAQ,EAAE,CAAC;YACxB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC9B,MAAM,cAAc,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC1E,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;YACxC,CAAC;YAED,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACtE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,WAAW,GAAG,IAAI,CAAC;gBACnB,MAAM,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YAED,kBAAkB;YAClB,IAAI,QAAQ,GAAG,SAAS,KAAK,CAAC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;gBAChD,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACxE,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAClB,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,cAAc;QACnC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,IAAI,WAAW,EAAE,CAAC;gBACd,WAAW,GAAG,KAAK,CAAC;gBACpB,MAAM,CAAC,MAAM,EAAE,CAAC;YACpB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,IAAI,WAAW,EAAE,CAAC;gBACd,WAAW,CAAC;oBACR,MAAM;oBACN,QAAQ;oBACR,UAAU,EAAE,GAAG,eAAe,SAAS;oBACvC,MAAM,EAAE,aAAa,CAAC,SAAS;iBAClC,CAAC,CAAC;YACP,CAAC;YACD,gEAAgE;QACpE,CAAC,CAAC,CAAC;IACP,CAAC;IAED,QAAQ;IACR,KAAK,CAAC,aAAa,CAAC,MAAwB;QACxC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC9B,OAAO,UAAU,GAAG,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC/B,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC,CAA+B,CAAC;QACjC,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -25,13 +25,13 @@ export interface ExportErr {
25
25
  export interface ExportOptions {
26
26
  outputPath: string;
27
27
  columns?: ExportColumn[];
28
- batchSize?: number;
29
28
  onCompleted?: ExportCompletedHook;
30
29
  onErr?: ExportErrHook;
31
30
  }
32
31
  export interface ExportMysqlOptions extends ExportOptions {
33
- table: string;
32
+ table?: string;
34
33
  where?: string;
34
+ rawSql?: string;
35
35
  }
36
36
  export interface ExportMongoOptions extends ExportOptions {
37
37
  db: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAGhD,MAAM,WAAW,kBAAkB;IAC/B,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,YAAY,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAC7D,YAAY,EAAE,YAAY,CAAC;CAC9B;AAGD,MAAM,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACjF,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAGxE,MAAM,WAAW,YAAY;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;CACzB;AAGD,MAAM,WAAW,aAAa;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,KAAK,CAAC,EAAE,aAAa,CAAC;CACzB;AAGD,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;CAC5B;AAGD,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,oBAAY,aAAa;IACrB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,MAAM,WAAW;CACpB;AAGD,MAAM,WAAW,gBAAgB;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB;AAGD,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC;CACtC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAGhD,MAAM,WAAW,kBAAkB;IAC/B,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,YAAY,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAC7D,YAAY,EAAE,YAAY,CAAC;CAC9B;AAGD,MAAM,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACjF,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAGxE,MAAM,WAAW,YAAY;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;CACzB;AAGD,MAAM,WAAW,aAAa;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,KAAK,CAAC,EAAE,aAAa,CAAC;CACzB;AAGD,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;CAC5B;AAGD,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,oBAAY,aAAa;IACrB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,MAAM,WAAW;CACpB;AAGD,MAAM,WAAW,gBAAgB;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB;AAGD,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC;CACtC"}
@@ -1,2 +1,7 @@
1
1
  export declare function isValidIdentifier(str: string): boolean;
2
+ /**
3
+ * 检查 rawSql 是否为安全的只读 SELECT 语句
4
+ * 仅阻止明显包含高危操作的语句,不阻断复杂 SELECT
5
+ */
6
+ export declare function isSafeRawSql(sql: string): boolean;
2
7
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/utils/tools.ts"],"names":[],"mappings":"AACA,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/utils/tools.ts"],"names":[],"mappings":"AACA,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA2BjD"}
@@ -2,4 +2,32 @@
2
2
  export function isValidIdentifier(str) {
3
3
  return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(str);
4
4
  }
5
+ /**
6
+ * 检查 rawSql 是否为安全的只读 SELECT 语句
7
+ * 仅阻止明显包含高危操作的语句,不阻断复杂 SELECT
8
+ */
9
+ export function isSafeRawSql(sql) {
10
+ const trimmed = sql.trim();
11
+ if (!trimmed)
12
+ return false;
13
+ // 必须以 SELECT 开头(不区分大小写)
14
+ if (!/^select\b/i.test(trimmed)) {
15
+ return false;
16
+ }
17
+ // 禁止包含分号(防止多语句注入)
18
+ if (trimmed.includes(';')) {
19
+ return false;
20
+ }
21
+ // 禁止包含高危关键字(作为独立单词,避免误杀如 "updated_at")
22
+ const dangerousKeywords = ['drop', 'delete', 'update', 'insert', 'create', 'alter', 'truncate', 'grant', 'revoke'];
23
+ const lowerSql = trimmed.toLowerCase();
24
+ for (const keyword of dangerousKeywords) {
25
+ // 使用 \b 确保匹配完整单词(例如不匹配 "updated" 中的 "update")
26
+ const regex = new RegExp(`\\b $ {keyword}\\b`, 'i');
27
+ if (regex.test(lowerSql)) {
28
+ return false;
29
+ }
30
+ }
31
+ return true;
32
+ }
5
33
  //# sourceMappingURL=tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/utils/tools.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,MAAM,UAAU,iBAAiB,CAAC,GAAW;IACzC,OAAO,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/utils/tools.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,MAAM,UAAU,iBAAiB,CAAC,GAAW;IACzC,OAAO,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,wBAAwB;IACxB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,kBAAkB;IAClB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,uCAAuC;IACvC,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnH,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEvC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACtC,8CAA8C;QAC9C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sch_cat/export-utils",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "type": "module",
5
5
  "description": "A lightweight CSV/Excel export utility for TS with TypeORM support",
6
6
  "exports": {