chanjs 2.0.8 → 2.0.9

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/helper/db.js CHANGED
@@ -46,6 +46,13 @@ export const db =({
46
46
  //默认为{min: 2, max: 10},连接池配置
47
47
  min,
48
48
  max,
49
+ // 添加连接池错误处理
50
+ afterCreate: (conn, done) => {
51
+ conn.on('error', (error) => {
52
+ console.error(`[连接池错误] 连接出错: ${getDefaultErrorMessage(error)}`, error);
53
+ });
54
+ done(null, conn);
55
+ }
49
56
  },
50
57
  log: {
51
58
  warn(message) {
@@ -71,5 +78,6 @@ export const db =({
71
78
  },
72
79
  },
73
80
  };
81
+
74
82
  return knex(config);
75
83
  };
package/helper/sign.js ADDED
@@ -0,0 +1,33 @@
1
+ import CryptoJS from "crypto-js";
2
+
3
+ /**
4
+ * AES加密
5
+ * @param message 要加密的字符串
6
+ * @param key 加密密钥
7
+ * @returns 加密后的字符串,加密失败返回空字符串
8
+ */
9
+ export const aesEncrypt = (obj, key = Chan.config.AES_SALT) => {
10
+ try {
11
+ const encrypted = CryptoJS.AES.encrypt(JSON.stringify(obj), key);
12
+ return encrypted.toString();
13
+ } catch (error) {
14
+ console.error("AES加密失败:", error);
15
+ return "";
16
+ }
17
+ };
18
+
19
+ /**
20
+ * AES解密
21
+ * @param encryptedMessage 要解密的字符串
22
+ * @param key 解密密钥(必须与加密时使用的密钥相同)
23
+ * @returns 解密后的原始字符串,解密失败返回空字符串
24
+ */
25
+ export const aesDecrypt = (str, key = Chan.config.AES_SALT) => {
26
+ try {
27
+ const decrypted = CryptoJS.AES.decrypt(str, key);
28
+ return decrypted.toString(CryptoJS.enc.Utf8);
29
+ } catch (error) {
30
+ console.error("AES解密失败:", error);
31
+ return "";
32
+ }
33
+ };
package/index.js CHANGED
@@ -76,7 +76,6 @@ class Chan {
76
76
  setStatic(this.app, statics);
77
77
  Cors(this.app, cors);
78
78
  setHeader(this.app, { APP_NAME, APP_VERSION });
79
-
80
79
  }
81
80
 
82
81
  //数据库操作
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "chanjs",
4
- "version": "2.0.8",
4
+ "version": "2.0.9",
5
5
  "description": "chanjs基于express5 纯js研发的轻量级mvc框架。",
6
6
  "main": "index.js",
7
7
  "module": "index.js",
@@ -30,7 +30,6 @@
30
30
  "knex": "^3.1.0",
31
31
  "morgan": "^1.10.0",
32
32
  "mysql2": "^3.14.1",
33
- "schedule": "^0.5.0",
34
- "zod": "^4.0.5"
33
+ "schedule": "^0.5.0"
35
34
  }
36
35
  }
@@ -1,217 +0,0 @@
1
- import {CODE,DB_ERROR} from "../config/code.js";
2
-
3
- // 响应工具函数
4
- const createResponse = (success, data, msg, code) => ({
5
- success,
6
- data: data || (success ? {} : null),
7
- msg: msg || (success ? CODE[200] : CODE[1001]),
8
- code: code || (success ? 200 : 1001)
9
- });
10
-
11
- const successResponse = (data, msg) => createResponse(true, data, msg);
12
- const failResponse = (msg, data, code) => createResponse(false, data, msg, code);
13
-
14
- // 错误处理函数
15
- const getDefaultErrorCode = (error) => {
16
- if (error.message.includes('syntax') || error.message.includes('SQL')) {
17
- return 6008;
18
- } else if (error.message.includes('Connection closed')) {
19
- return 6009;
20
- } else if (error.message.includes('permission')) {
21
- return 3003;
22
- }
23
- return 5001;
24
- };
25
-
26
- const handleError = (err) => {
27
- console.error('Database Error:', err);
28
- const errorCode = DB_ERROR[err.code] || getDefaultErrorCode(err);
29
-
30
- return failResponse(
31
- CODE[errorCode],
32
- { sql: err.sql, sqlMessage: err.sqlMessage },
33
- errorCode
34
- );
35
- };
36
-
37
- // 基础查询构建函数
38
- const buildQuery = (knex, model, query = {}) => {
39
- let dbQuery = knex(model);
40
- if (Object.keys(query).length > 0) {
41
- dbQuery = dbQuery.where(query);
42
- }
43
- return dbQuery;
44
- };
45
-
46
- /**
47
- * 查询表所有记录(慎用)
48
- */
49
- export const all = async (knex, model, query = {}) => {
50
- try {
51
- const res = await buildQuery(knex, model, query).select();
52
- return successResponse(res);
53
- } catch (err) {
54
- return handleError(err);
55
- }
56
- };
57
-
58
- /**
59
- * 获取单个记录
60
- */
61
- export const one = async (knex, model, query = {}) => {
62
- try {
63
- const res = await buildQuery(knex, model, query).first();
64
- return successResponse(res);
65
- } catch (err) {
66
- return handleError(err);
67
- }
68
- };
69
-
70
- /**
71
- * 根据条件查询记录
72
- */
73
- export const findById = async (knex, model, { query = {}, field = [], len = 1 }) => {
74
- try {
75
- let dataQuery = knex(model).where(query);
76
-
77
- if (field.length > 0) dataQuery = dataQuery.select(field);
78
- if (len === 1) dataQuery = dataQuery.first();
79
- else if (len > 1) dataQuery = dataQuery.limit(len);
80
-
81
- const res = await dataQuery;
82
- return successResponse(res || (len === 1 ? {} : []));
83
- } catch (err) {
84
- return handleError(err);
85
- }
86
- };
87
-
88
- /**
89
- * 创建新记录
90
- */
91
- export const insert = async (knex, model, data = {}) => {
92
- try {
93
- if (Object.keys(data).length === 0) {
94
- return failResponse(CODE[2002], null, 2002);
95
- }
96
- const result = await knex(model).insert(data);
97
- return successResponse(result?.length > 0 || !!result);
98
- } catch (err) {
99
- return handleError(err);
100
- }
101
- };
102
-
103
- /**
104
- * 插入多条记录
105
- */
106
- export const insertMany = async (knex, model, records = []) => {
107
- try {
108
- if (records.length === 0) {
109
- return failResponse(CODE[2002], null, 2002);
110
- }
111
- const result = await knex(model).insert(records);
112
- return successResponse(result);
113
- } catch (err) {
114
- return handleError(err);
115
- }
116
- };
117
-
118
- /**
119
- * 根据指定条件删除记录
120
- */
121
- export const del = async (knex, model, query = {}) => {
122
- try {
123
- if (Object.keys(query).length === 0) {
124
- return failResponse(CODE[2002], null, 2002);
125
- }
126
- const affectedRows = await knex(model).where(query).del();
127
- return successResponse(affectedRows > 0);
128
- } catch (err) {
129
- return handleError(err);
130
- }
131
- };
132
-
133
- /**
134
- * 根据指定条件更新记录
135
- */
136
- export const update = async (knex, model, query = {}, params = {}) => {
137
- try {
138
- if (Object.keys(query).length === 0 || Object.keys(params).length === 0) {
139
- return failResponse(CODE[2001], null, 2001);
140
- }
141
- const result = await knex(model).where(query).update(params);
142
- return successResponse(!!result);
143
- } catch (err) {
144
- return handleError(err);
145
- }
146
- };
147
-
148
- /**
149
- * 批量更新多条记录
150
- */
151
- export const updateMany = async (knex, model, updates = []) => {
152
- if (!Array.isArray(updates) || updates.length === 0) {
153
- return failResponse(CODE[2002], null, 2002);
154
- }
155
-
156
- const trx = await knex.transaction();
157
- try {
158
- for (const { query, params } of updates) {
159
- const result = await trx(model).where(query).update(params);
160
- if (result === 0) {
161
- await trx.rollback();
162
- return failResponse(`更新失败: ${JSON.stringify(query)}`);
163
- }
164
- }
165
- await trx.commit();
166
- return successResponse(true);
167
- } catch (err) {
168
- await trx.rollback();
169
- return handleError(err);
170
- }
171
- };
172
-
173
- /**
174
- * 分页查询
175
- */
176
- export const query = async (knex, model, { current = 1, pageSize = 10, query = {}, field = [] }) => {
177
- try {
178
- const offset = (current - 1) * pageSize;
179
- let countQuery = knex(model).count("* as total");
180
- let dataQuery = knex(model);
181
-
182
- if (Object.keys(query).length > 0) {
183
- Object.entries(query).forEach(([key, value]) => {
184
- countQuery = countQuery.where(key, value);
185
- dataQuery = dataQuery.where(key, value);
186
- });
187
- }
188
-
189
- if (field.length > 0) dataQuery = dataQuery.select(field);
190
-
191
- const [totalResult, list] = await Promise.all([
192
- countQuery.first(),
193
- dataQuery.offset(offset).limit(pageSize)
194
- ]);
195
-
196
- const total = totalResult?.total || 0;
197
- return successResponse({ list, total, current, pageSize });
198
- } catch (err) {
199
- return handleError(err);
200
- }
201
- };
202
-
203
- /**
204
- * 计数查询
205
- */
206
- export const count = async (knex, model, query = []) => {
207
- try {
208
- let dataQuery = knex(model);
209
- if (query.length > 0) {
210
- query.forEach(condition => dataQuery = dataQuery.where(condition));
211
- }
212
- const result = await dataQuery.count("* as total").first();
213
- return successResponse(Number(result?.total) || 0);
214
- } catch (err) {
215
- return handleError(err);
216
- }
217
- };
@@ -1,2 +0,0 @@
1
- import { z } from "zod";
2
- export { z };