我实现了必须对不同的api进行两次调用并组合响应的模式, 如果有更好的方法或最佳实践来完成这些任务,我需要专家的帮助。
在getBalanceController调用两个API来使用axios检索响应的情况下,在以下情况下可以遵循的良好设计是什么?只是想确保我没有做任何多余的事情。
getBalanceController.ts
import {Controller,Body} from 'tsoa';
import {AdminHandler} from "./AdminHandler";
import {ClientHandler} from "./ClientHandler";
export class GetBalanceController extends Controller {
public static async process(@Request() request: ExpressRequest,
response: ExpressResponse): Promise < any > {
try {
const instance = new GetBalanceController();
const data = await instance.execute(request, response);
response.status(200);
response.send(data);
} catch (err) {
response.status(200);
response.send(err.message);
}
}
private _request: IRequestURL[] = [];
constructor() {
super();
}
private async execute(@Request() request: ExpressRequest, response: ExpressResponse): Promise < any > {
buildResponses:any = [];
try {
const _adminData = await AdminHandler.process(request,response);
const _clientData = await ClientHandler.process(request,response);
buildResponses.Details.push(_adminData, _caremarkData);
} catch (err) {
return Promise.reject(err);
}
return buildResponses;
}
}
adminHandler.ts
import {Controller,Body} from 'tsoa';
export class AdminHandler extends Controller {
public static async process(@Request() request: any,
response: any): Promise<any> {
try {
const instance = new AdminHandler();
const data = await instance.execute(request);
response.status(200);
response.send(data);
} catch (err) {
response.status(200);
response.send(err.message);
}
}
constructor() {
super();
}
public async execute(@Body() _request: any): Promise<any> {
let result: any;
try {
const url = "adminUrl;
const requestKeys: string[] = Object.keys(_request);
if (requestKeys.length !== 1 ||
!(_request[requestKeys[0]].details && _request[requestKeys[0]].details.tokenId)) {
throw new Error("Invalid request");
}
const response: any = await axios.post(url, _request);
result = response.data;
} catch (err) {
return Promise.reject(err);
}
return Promise.resolve(result);
}
// there will be another method that will be called again from main controller to customize the response.
}
clientHandler.ts
import {Controller,Body} from 'tsoa';
export class ClientHandler extends Controller {
public static async process(@Request() request: any,
response: any): Promise<any> {
try {
const instance = new ClientHandler();
const data = await instance.execute(request);
response.status(200);
response.send(data);
} catch (err) {
response.status(200);
response.send(err.message);
}
}
constructor() {
super();
}
public async execute(@Body() _request: any): Promise<any> {
let result: any;
try {
const url = "clientUrl;
const requestKeys: string[] = Object.keys(_request);
if (requestKeys.length !== 1 ||
!(_request[requestKeys[0]].details && _request[requestKeys[0]].details.tokenId)) {
throw new Error("Invalid request");
}
const response: any = await axios.post(url, _request);
result = response.data;
} catch (err) {
return Promise.reject(err);
}
return Promise.resolve(result);
}
// there will be another method that will be called again from main controller to customize the response.
}