@jiangnian520/midway-response 0.0.0-stage → 1.0.1

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.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,4 @@
1
+ export declare class ResponseConfiguration {
2
+ app: any;
3
+ onReady(): Promise<void>;
4
+ }
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.ResponseConfiguration = void 0;
46
+ const core_1 = require("@midwayjs/core");
47
+ const DefaultConfig = __importStar(require("./config/config.default"));
48
+ const global_exception_filter_1 = require("./core/global-exception.filter");
49
+ const response_middleware_1 = require("./core/response.middleware");
50
+ let ResponseConfiguration = class ResponseConfiguration {
51
+ async onReady() {
52
+ if (this.app && typeof this.app.useMiddleware === 'function') {
53
+ this.app.useMiddleware([response_middleware_1.ResponseMiddleware]);
54
+ }
55
+ if (this.app && typeof this.app.useFilter === 'function') {
56
+ this.app.useFilter([global_exception_filter_1.GlobalExceptionFilter]);
57
+ }
58
+ }
59
+ };
60
+ exports.ResponseConfiguration = ResponseConfiguration;
61
+ __decorate([
62
+ (0, core_1.MainApp)(),
63
+ __metadata("design:type", Object)
64
+ ], ResponseConfiguration.prototype, "app", void 0);
65
+ exports.ResponseConfiguration = ResponseConfiguration = __decorate([
66
+ (0, core_1.Configuration)({
67
+ namespace: 'response',
68
+ importConfigs: [{ default: DefaultConfig }],
69
+ })
70
+ ], ResponseConfiguration);
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25maWd1cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlDQUF3RDtBQUN4RCx1RUFBeUQ7QUFDekQsNEVBQXVFO0FBQ3ZFLG9FQUFnRTtBQU16RCxJQUFNLHFCQUFxQixHQUEzQixNQUFNLHFCQUFxQjtJQUloQyxLQUFLLENBQUMsT0FBTztRQUNYLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsd0NBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLCtDQUFxQixDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUFaWSxzREFBcUI7QUFFaEM7SUFEQyxJQUFBLGNBQU8sR0FBRTs7a0RBQ0Q7Z0NBRkUscUJBQXFCO0lBSmpDLElBQUEsb0JBQWEsRUFBQztRQUNiLFNBQVMsRUFBRSxVQUFVO1FBQ3JCLGFBQWEsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO0tBQzVDLENBQUM7R0FDVyxxQkFBcUIsQ0FZakMifQ==
@@ -0,0 +1,16 @@
1
+ import type { StandardResponse, PageResult } from '../interface';
2
+ export declare class AjaxResult<T = any> implements StandardResponse<T> {
3
+ code: number;
4
+ msg: string;
5
+ data: T | null;
6
+ startTime?: string;
7
+ endTime?: string;
8
+ wasteTime?: string;
9
+ constructor(code?: number, msg?: string, data?: T | null);
10
+ static success<T>(data?: T, msg?: string): AjaxResult<T>;
11
+ static error(code?: number, msg?: string, data?: any): AjaxResult;
12
+ static page<T>(rows: T[], count: number, msg?: string): AjaxResult<PageResult<T>>;
13
+ /** 附加耗时信息 */
14
+ withMeta(startTime: string, endTime: string, wasteTime: string): this;
15
+ toJSON(): StandardResponse<T>;
16
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AjaxResult = void 0;
4
+ class AjaxResult {
5
+ constructor(code = 200, msg = 'OK', data = null) {
6
+ this.code = code;
7
+ this.msg = msg;
8
+ this.data = data;
9
+ }
10
+ static success(data, msg = '操作成功') {
11
+ return new AjaxResult(200, msg, data ?? null);
12
+ }
13
+ static error(code = 500, msg = '操作失败', data = null) {
14
+ return new AjaxResult(code, msg, data);
15
+ }
16
+ static page(rows, count, msg = '查询成功') {
17
+ return new AjaxResult(200, msg, { rows, count });
18
+ }
19
+ /** 附加耗时信息 */
20
+ withMeta(startTime, endTime, wasteTime) {
21
+ this.startTime = startTime;
22
+ this.endTime = endTime;
23
+ this.wasteTime = wasteTime;
24
+ return this;
25
+ }
26
+ toJSON() {
27
+ return {
28
+ code: this.code,
29
+ msg: this.msg,
30
+ data: this.data,
31
+ ...(this.startTime ? { startTime: this.startTime, endTime: this.endTime, wasteTime: this.wasteTime } : {})
32
+ };
33
+ }
34
+ }
35
+ exports.AjaxResult = AjaxResult;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWpheC1yZXN1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9hamF4LXJlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxNQUFhLFVBQVU7SUFVbkIsWUFBWSxPQUFlLEdBQUcsRUFBRSxNQUFjLElBQUksRUFBRSxPQUFpQixJQUFJO1FBQ3JFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFPLENBQUksSUFBUSxFQUFFLE1BQWMsTUFBTTtRQUM1QyxPQUFPLElBQUksVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQWUsR0FBRyxFQUFFLE1BQWMsTUFBTSxFQUFFLE9BQVksSUFBSTtRQUNuRSxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUksSUFBUyxFQUFFLEtBQWEsRUFBRSxNQUFjLE1BQU07UUFDekQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELGFBQWE7SUFDYixRQUFRLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsU0FBaUI7UUFDMUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU07UUFDRixPQUFPO1lBQ0gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzdHLENBQUM7SUFDTixDQUFDO0NBQ0o7QUE1Q0QsZ0NBNENDIn0=
@@ -0,0 +1,43 @@
1
+ import type { Context } from '@midwayjs/koa';
2
+ import { AjaxResult } from './ajax-result';
3
+ /**
4
+ * # 业务 Controller 的基类
5
+ *
6
+ * 强烈建议业务项目的所有 Controller 都继承此类。
7
+ * 它封装了常用了响应格式化方法,让业务代码保持极简。
8
+ *
9
+ * @example
10
+ * // 业务代码中的使用方式
11
+ * export class UserController extends BaseController {
12
+ * async getUser() {
13
+ * const user = await this.userService.getUser();
14
+ * return this.success(user); // 直接使用 this.success
15
+ * }
16
+ * }
17
+ */
18
+ export declare abstract class BaseController {
19
+ ctx: Context;
20
+ /**
21
+ * 快速返回成功消息
22
+ * @param data 数据
23
+ * @param msg 提示语,默认 '操作成功'
24
+ */
25
+ success<T>(data?: T, msg?: string): AjaxResult<T>;
26
+ /**
27
+ * 快速返回失败消息
28
+ * @param msg 提示语,默认 '操作失败'
29
+ * @param code 错误码,默认 500
30
+ */
31
+ error(msg?: string, code?: number): AjaxResult<any>;
32
+ /**
33
+ * 快速返回分页数据
34
+ * @param rows 列表数据
35
+ * @param count 总条数
36
+ */
37
+ toRaw<T>(rows: T[], count: number): AjaxResult<import("..").PageResult<T>>;
38
+ /**
39
+ * 根据影响行数返回成功或失败 (常用于 Update/Delete)
40
+ * @param rows 影响行数,或者布尔值
41
+ */
42
+ toAjax(rows: number | boolean): AjaxResult<any>;
43
+ }
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.BaseController = void 0;
13
+ const core_1 = require("@midwayjs/core");
14
+ const ajax_result_1 = require("./ajax-result");
15
+ /**
16
+ * # 业务 Controller 的基类
17
+ *
18
+ * 强烈建议业务项目的所有 Controller 都继承此类。
19
+ * 它封装了常用了响应格式化方法,让业务代码保持极简。
20
+ *
21
+ * @example
22
+ * // 业务代码中的使用方式
23
+ * export class UserController extends BaseController {
24
+ * async getUser() {
25
+ * const user = await this.userService.getUser();
26
+ * return this.success(user); // 直接使用 this.success
27
+ * }
28
+ * }
29
+ */
30
+ class BaseController {
31
+ /**
32
+ * 快速返回成功消息
33
+ * @param data 数据
34
+ * @param msg 提示语,默认 '操作成功'
35
+ */
36
+ success(data, msg = '操作成功') {
37
+ return ajax_result_1.AjaxResult.success(data, msg);
38
+ }
39
+ /**
40
+ * 快速返回失败消息
41
+ * @param msg 提示语,默认 '操作失败'
42
+ * @param code 错误码,默认 500
43
+ */
44
+ error(msg = '操作失败', code = 500) {
45
+ return ajax_result_1.AjaxResult.error(code, msg);
46
+ }
47
+ /**
48
+ * 快速返回分页数据
49
+ * @param rows 列表数据
50
+ * @param count 总条数
51
+ */
52
+ toRaw(rows, count) {
53
+ return ajax_result_1.AjaxResult.page(rows, count);
54
+ }
55
+ /**
56
+ * 根据影响行数返回成功或失败 (常用于 Update/Delete)
57
+ * @param rows 影响行数,或者布尔值
58
+ */
59
+ toAjax(rows) {
60
+ return Number(rows) > 0 ? this.success() : this.error('操作失败');
61
+ }
62
+ }
63
+ exports.BaseController = BaseController;
64
+ __decorate([
65
+ (0, core_1.Inject)(),
66
+ __metadata("design:type", Object)
67
+ ], BaseController.prototype, "ctx", void 0);
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvYmFzZS1jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHlDQUF3QztBQUV4QywrQ0FBMkM7QUFFM0M7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFzQixjQUFjO0lBSWhDOzs7O09BSUc7SUFDSCxPQUFPLENBQUksSUFBUSxFQUFFLE1BQWMsTUFBTTtRQUNyQyxPQUFPLHdCQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxNQUFjLE1BQU0sRUFBRSxPQUFlLEdBQUc7UUFDMUMsT0FBTyx3QkFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUksSUFBUyxFQUFFLEtBQWE7UUFDN0IsT0FBTyx3QkFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxJQUFzQjtRQUN6QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRSxDQUFDO0NBQ0o7QUF0Q0Qsd0NBc0NDO0FBcENHO0lBREMsSUFBQSxhQUFNLEdBQUU7OzJDQUNJIn0=
@@ -0,0 +1,5 @@
1
+ import type { Context } from '@midwayjs/koa';
2
+ import { AjaxResult } from './ajax-result';
3
+ export declare class GlobalExceptionFilter {
4
+ catch(err: Error, ctx: Context): Promise<AjaxResult<any>>;
5
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.GlobalExceptionFilter = void 0;
10
+ const core_1 = require("@midwayjs/core");
11
+ const ajax_result_1 = require("./ajax-result");
12
+ let GlobalExceptionFilter = class GlobalExceptionFilter {
13
+ async catch(err, ctx) {
14
+ let code = 500;
15
+ let msg = '服务器内部错误';
16
+ if (err instanceof core_1.MidwayHttpError) {
17
+ code = err.status;
18
+ msg = err.message;
19
+ }
20
+ else if (err instanceof core_1.MidwayError) {
21
+ msg = err.message;
22
+ }
23
+ else {
24
+ ctx.logger.error('[GlobalExceptionFilter] 运行时异常:', err);
25
+ if (process.env.NODE_ENV === 'local') {
26
+ msg = err.message;
27
+ }
28
+ }
29
+ const end = Date.now();
30
+ const stTime = ctx.state.__req_start_time__ || new Date().toISOString();
31
+ const startMs = ctx.state.__req_start_ms__ || end;
32
+ const edTime = new Date().toISOString();
33
+ const waste = `${end - startMs}ms`;
34
+ // ========================================================
35
+ // ✅ 核心区别:把 HTTP 状态码设置为真实的错误码
36
+ // 这样 401 就是 401,500 就是 500。
37
+ // 前端 Axios 会自动进入 catch 或 response.error 拦截器。
38
+ // ========================================================
39
+ ctx.status = code;
40
+ // 依然返回标准的 JSON 结构
41
+ return ajax_result_1.AjaxResult.error(code, msg).withMeta(stTime, edTime, waste);
42
+ }
43
+ };
44
+ exports.GlobalExceptionFilter = GlobalExceptionFilter;
45
+ exports.GlobalExceptionFilter = GlobalExceptionFilter = __decorate([
46
+ (0, core_1.Catch)()
47
+ ], GlobalExceptionFilter);
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWV4Y2VwdGlvbi5maWx0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9nbG9iYWwtZXhjZXB0aW9uLmZpbHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSx5Q0FBcUU7QUFFckUsK0NBQTJDO0FBR3BDLElBQU0scUJBQXFCLEdBQTNCLE1BQU0scUJBQXFCO0lBQzlCLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBVSxFQUFFLEdBQVk7UUFDaEMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDO1FBRXBCLElBQUksR0FBRyxZQUFZLHNCQUFlLEVBQUUsQ0FBQztZQUNqQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUNsQixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDO2FBQU0sSUFBSSxHQUFHLFlBQVksa0JBQVcsRUFBRSxDQUFDO1lBQ3BDLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7YUFBTSxDQUFDO1lBQ0osR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDeEQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDdEIsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLElBQUksR0FBRyxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsT0FBTyxJQUFJLENBQUM7UUFFbkMsMkRBQTJEO1FBQzNELDZCQUE2QjtRQUM3Qiw0QkFBNEI7UUFDNUIsNkNBQTZDO1FBQzdDLDJEQUEyRDtRQUMzRCxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUVsQixrQkFBa0I7UUFDbEIsT0FBTyx3QkFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQztDQUNKLENBQUE7QUFqQ1ksc0RBQXFCO2dDQUFyQixxQkFBcUI7SUFEakMsSUFBQSxZQUFLLEdBQUU7R0FDSyxxQkFBcUIsQ0FpQ2pDIn0=
@@ -0,0 +1,6 @@
1
+ import type { IMiddleware } from '@midwayjs/core';
2
+ import type { NextFunction, Context } from '@midwayjs/koa';
3
+ export declare class ResponseMiddleware implements IMiddleware<Context, NextFunction> {
4
+ resolve(): (ctx: Context, next: NextFunction) => Promise<void>;
5
+ static getName(): string;
6
+ }
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.ResponseMiddleware = void 0;
43
+ const core_1 = require("@midwayjs/core");
44
+ const ajax_result_1 = require("./ajax-result");
45
+ const stream = __importStar(require("stream"));
46
+ let ResponseMiddleware = class ResponseMiddleware {
47
+ resolve() {
48
+ return async (ctx, next) => {
49
+ const start = Date.now();
50
+ const stTime = new Date().toISOString(); // 也可以换成你之前的格式化工具
51
+ // 将开始时间挂载到 ctx 上,给异常过滤器用
52
+ ctx.state.__req_start_time__ = stTime;
53
+ ctx.state.__req_start_ms__ = start;
54
+ await next();
55
+ // 1. 如果是文件流、Buffer、或者没返回值,直接跳过不包装
56
+ if (ctx.body === undefined ||
57
+ ctx.body === null ||
58
+ ctx.body instanceof stream.Stream ||
59
+ Buffer.isBuffer(ctx.body)) {
60
+ return;
61
+ }
62
+ // 2. 如果业务代码已经手动返回了 AjaxResult,则补充耗时信息即可
63
+ const end = Date.now();
64
+ const edTime = new Date().toISOString();
65
+ const waste = `${end - start}ms`;
66
+ if (ctx.body instanceof ajax_result_1.AjaxResult) {
67
+ ctx.body.withMeta(stTime, edTime, waste);
68
+ return;
69
+ }
70
+ // 3. 如果返回的是普通对象或数组(且状态码为 2xx),自动包装!
71
+ if (ctx.status >= 200 && ctx.status < 300) {
72
+ ctx.body = ajax_result_1.AjaxResult.success(ctx.body).withMeta(stTime, edTime, waste);
73
+ }
74
+ };
75
+ }
76
+ static getName() {
77
+ return 'responseMiddleware';
78
+ }
79
+ };
80
+ exports.ResponseMiddleware = ResponseMiddleware;
81
+ exports.ResponseMiddleware = ResponseMiddleware = __decorate([
82
+ (0, core_1.Middleware)()
83
+ ], ResponseMiddleware);
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UubWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3Jlc3BvbnNlLm1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQTRDO0FBRzVDLCtDQUEyQztBQUMzQywrQ0FBaUM7QUFHMUIsSUFBTSxrQkFBa0IsR0FBeEIsTUFBTSxrQkFBa0I7SUFDM0IsT0FBTztRQUNILE9BQU8sS0FBSyxFQUFFLEdBQVksRUFBRSxJQUFrQixFQUFFLEVBQUU7WUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxpQkFBaUI7WUFFMUQseUJBQXlCO1lBQ3pCLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO1lBQ3RDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBRW5DLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFFYixrQ0FBa0M7WUFDbEMsSUFDSSxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVM7Z0JBQ3RCLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSTtnQkFDakIsR0FBRyxDQUFDLElBQUksWUFBWSxNQUFNLENBQUMsTUFBTTtnQkFDakMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQzNCLENBQUM7Z0JBQ0MsT0FBTztZQUNYLENBQUM7WUFFRCx3Q0FBd0M7WUFDeEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxJQUFJLENBQUM7WUFFakMsSUFBSSxHQUFHLENBQUMsSUFBSSxZQUFZLHdCQUFVLEVBQUUsQ0FBQztnQkFDakMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDekMsT0FBTztZQUNYLENBQUM7WUFFRCxvQ0FBb0M7WUFDcEMsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUN4QyxHQUFHLENBQUMsSUFBSSxHQUFHLHdCQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1RSxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFPO1FBQ1YsT0FBTyxvQkFBb0IsQ0FBQztJQUNoQyxDQUFDO0NBQ0osQ0FBQTtBQTFDWSxnREFBa0I7NkJBQWxCLGtCQUFrQjtJQUQ5QixJQUFBLGlCQUFVLEdBQUU7R0FDQSxrQkFBa0IsQ0EwQzlCIn0=
@@ -0,0 +1,44 @@
1
+ export { ResponseConfiguration as Configuration } from './configuration';
2
+ export { AjaxResult } from './core/ajax-result';
3
+ export { BaseController } from './core/base-controller';
4
+ export { GlobalExceptionFilter } from './core/global-exception.filter';
5
+ export { ResponseMiddleware } from './core/response.middleware';
6
+ export * from './interface';
7
+ /**
8
+ * ==========================================
9
+ * 💡 用户使用指南
10
+ * ==========================================
11
+ *
12
+ * 1. 在 configuration.ts 中引入组件:
13
+ * ```typescript
14
+ * import * as response from '@jiangnian520/midway-response';
15
+ *
16
+ * @Configuration({ imports: [koa, response] })
17
+ * export class MainConfiguration {}
18
+ * ```
19
+ *
20
+ * 2. 在 Controller 中继承 BaseController 直接使用:
21
+ * ```typescript
22
+ * import { BaseController } from '@jiangnian520/midway-response';
23
+ *
24
+ * @Controller('/user')
25
+ * export class UserController extends BaseController {
26
+ *
27
+ * @Get('/info')
28
+ * async getInfo() {
29
+ * const data = await this.userService.getInfo();
30
+ * // 自动格式化为 { code: 200, msg: '操作成功', data: xxx }
31
+ * return this.success(data);
32
+ * }
33
+ *
34
+ * }
35
+ * ```
36
+ *
37
+ * 3. 如果业务抛出异常:
38
+ * ```typescript
39
+ * import { httpError } from '@midwayjs/core';
40
+ *
41
+ * throw new httpError.BadRequestError('参数错误');
42
+ * // 框架会自动捕获,并返回 { code: 400, msg: '参数错误', data: null }
43
+ * ```
44
+ */
package/dist/index.js ADDED
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ResponseMiddleware = exports.GlobalExceptionFilter = exports.BaseController = exports.AjaxResult = exports.Configuration = void 0;
18
+ var configuration_1 = require("./configuration");
19
+ Object.defineProperty(exports, "Configuration", { enumerable: true, get: function () { return configuration_1.ResponseConfiguration; } });
20
+ var ajax_result_1 = require("./core/ajax-result");
21
+ Object.defineProperty(exports, "AjaxResult", { enumerable: true, get: function () { return ajax_result_1.AjaxResult; } });
22
+ var base_controller_1 = require("./core/base-controller");
23
+ Object.defineProperty(exports, "BaseController", { enumerable: true, get: function () { return base_controller_1.BaseController; } });
24
+ var global_exception_filter_1 = require("./core/global-exception.filter");
25
+ Object.defineProperty(exports, "GlobalExceptionFilter", { enumerable: true, get: function () { return global_exception_filter_1.GlobalExceptionFilter; } });
26
+ var response_middleware_1 = require("./core/response.middleware");
27
+ Object.defineProperty(exports, "ResponseMiddleware", { enumerable: true, get: function () { return response_middleware_1.ResponseMiddleware; } });
28
+ __exportStar(require("./interface"), exports);
29
+ /**
30
+ * ==========================================
31
+ * 💡 用户使用指南
32
+ * ==========================================
33
+ *
34
+ * 1. 在 configuration.ts 中引入组件:
35
+ * ```typescript
36
+ * import * as response from '@jiangnian520/midway-response';
37
+ *
38
+ * @Configuration({ imports: [koa, response] })
39
+ * export class MainConfiguration {}
40
+ * ```
41
+ *
42
+ * 2. 在 Controller 中继承 BaseController 直接使用:
43
+ * ```typescript
44
+ * import { BaseController } from '@jiangnian520/midway-response';
45
+ *
46
+ * @Controller('/user')
47
+ * export class UserController extends BaseController {
48
+ *
49
+ * @Get('/info')
50
+ * async getInfo() {
51
+ * const data = await this.userService.getInfo();
52
+ * // 自动格式化为 { code: 200, msg: '操作成功', data: xxx }
53
+ * return this.success(data);
54
+ * }
55
+ *
56
+ * }
57
+ * ```
58
+ *
59
+ * 3. 如果业务抛出异常:
60
+ * ```typescript
61
+ * import { httpError } from '@midwayjs/core';
62
+ *
63
+ * throw new httpError.BadRequestError('参数错误');
64
+ * // 框架会自动捕获,并返回 { code: 400, msg: '参数错误', data: null }
65
+ * ```
66
+ */
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBeUU7QUFBaEUsOEdBQUEscUJBQXFCLE9BQWlCO0FBQy9DLGtEQUFnRDtBQUF2Qyx5R0FBQSxVQUFVLE9BQUE7QUFDbkIsMERBQXdEO0FBQS9DLGlIQUFBLGNBQWMsT0FBQTtBQUN2QiwwRUFBdUU7QUFBOUQsZ0lBQUEscUJBQXFCLE9BQUE7QUFDOUIsa0VBQWdFO0FBQXZELHlIQUFBLGtCQUFrQixPQUFBO0FBQzNCLDhDQUE0QjtBQUU1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRyJ9
@@ -0,0 +1,47 @@
1
+ /**
2
+ * 标准单条/对象返回结构 (对应 AjaxResult.toJSON() 的返回值)
3
+ */
4
+ export interface StandardResponse<T = any> {
5
+ /** 业务状态码,200表示成功 */
6
+ code: number;
7
+ /** 提示消息 */
8
+ msg: string;
9
+ /** 业务数据 */
10
+ data: T | null;
11
+ }
12
+ /**
13
+ * 标准分页返回结构 (对应 AjaxResult.page() 中的 data 字段)
14
+ */
15
+ export interface PageResult<T = any> {
16
+ /** 当前页的数据列表 */
17
+ rows: T[];
18
+ /** 数据总条数 */
19
+ count: number;
20
+ }
21
+ /**
22
+ * 响应组件全局配置
23
+ */
24
+ export interface ResponseConfig {
25
+ /**
26
+ * 是否启用全局异常过滤器,默认 true。
27
+ * 关闭后,业务抛出的异常将由 Midway 框架默认处理。
28
+ */
29
+ enable?: boolean;
30
+ }
31
+ /**
32
+ * 标准返回结构 (前端收到的 JSON 长这样)
33
+ */
34
+ export interface StandardResponse<T = any> {
35
+ code: number;
36
+ msg: string;
37
+ data: T | null;
38
+ /** 请求开始时间 (ISO格式) */
39
+ startTime?: string;
40
+ /** 请求结束时间 (ISO格式) */
41
+ endTime?: string;
42
+ /** 接口耗时 (如 "25ms") */
43
+ wasteTime?: string;
44
+ }
45
+ export interface ResponseConfig {
46
+ enable?: boolean;
47
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
package/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export * from './dist/index';
2
+
3
+ declare module '@midwayjs/core/dist/interface' {
4
+ interface MidwayConfig {
5
+ response?: import('./dist/interface').ResponseConfig;
6
+ }
7
+ }
package/package.json CHANGED
@@ -1,6 +1,37 @@
1
1
  {
2
2
  "name": "@jiangnian520/midway-response",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "1.0.1",
4
+ "description": "专为 Midway 4.0 打造的统一响应与异常格式化组件,支持全自动包装与耗时统计。",
5
+ "main": "dist/index.js",
6
+ "typings": "index.d.ts",
7
+ "keywords": [
8
+ "midway",
9
+ "midwayjs",
10
+ "response",
11
+ "exception-filter",
12
+ "ajax-result"
13
+ ],
14
+ "author": "jiangnian520",
15
+ "license": "MIT",
16
+ "files": [
17
+ "dist/**/*.js",
18
+ "dist/**/*.d.ts",
19
+ "index.d.ts"
20
+ ],
21
+ "scripts": {
22
+ "build": "mwtsc --cleanOutDir"
23
+ },
24
+ "peerDependencies": {
25
+ "@midwayjs/core": ">=4.0.0",
26
+ "@midwayjs/koa": ">=4.0.0"
27
+ },
28
+ "devDependencies": {
29
+ "@midwayjs/core": "^4.0.0",
30
+ "@midwayjs/koa": "^4.0.0",
31
+ "mwtsc": "^1.4.0",
32
+ "typescript": "^5.3.0"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ }
6
37
  }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.