响应处理器

对于业务需要自定义响应格式的情形,bwcx 内建提供了响应处理器,接口只需要返回符合 DTO 约束的对象,然后交由响应处理器处理。

定义响应处理器

import { ResponseHandler, IBwcxResponseHandler, RequestContext } from 'bwcx-ljsm';

@ResponseHandler()
export default class GeneralResponseHandler implements IBwcxResponseHandler {
  // response 参数为路由方法的返回
  handle(response: any, ctx: RequestContext) {
    // 可以对原返回内容包装,用此对象作为响应
    return {
      success: true,
      code: 0,
      data: response,
    };
  }
}

如上示例,当我们的路由方法返回 { rows: [] } 时,经过响应处理器,最终的响应体将变为:

{
  "success": true,
  "code": 0,
  "data": {
    "rows": []
  }
}

配置默认响应处理器

如果应用中大部分接口都有固定的响应格式,则建议配置默认响应处理器。

import GeneralResponseHandler from './response-handlers/general.response-handler';

class OurApp extends App {
  protected responseHandler = GeneralResponseHandler;
}



 

在控制器中使用响应处理器

对于个别接口需要定制响应的情形,可以单独针对控制器或路由方法应用响应处理器。

首先,我们需要为我们的响应处理器类创建一个自定义装饰器,这将方便我们在控制器上应用它。

import { ResponseHandler, IBwcxResponseHandler, RequestContext, createResponseHandlerDecorator } from 'bwcx-ljsm';

@ResponseHandler()
export default class GeneralResponseHandler implements IBwcxResponseHandler {
  // response 参数为路由方法的返回
  handle(response: any, ctx: RequestContext) {
    // 可以对原返回内容包装,用此对象作为响应
    return {
      success: true,
      code: 0,
      data: response,
    };
  }
}

export function GeneralResponse() {
  return createResponseHandlerDecorator(GeneralResponseHandler);
}















 
 
 

在控制器上使用装饰器:

import { Inject } from 'bwcx-core';
import { Controller, Get } from 'bwcx-ljsm';
import { GeneralResponse } from '../response-handlers/general.response-handler';

@Controller('/user')
@GeneralResponse()
export default class UserController {
  @Get('/get')
  // 或只给指定路由方法应用响应处理器
  @GeneralResponse()
  async getUsers() {
    return {
      rows: await this.userService.getUsers(),
    };
  }
}





 



 






TIP

响应处理器只有一个会生效,其匹配优先级为 路由方法 > 控制器 > 全局

请勿在同一位置多次应用响应处理器(如在同一个路由方法上应用多个响应处理器),这可能会导致预期外的结果。