@jiaxinjiang/nest-http
Version:
Http request component for NestJs.
134 lines • 6.38 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var HttpFetchService_1;
Object.defineProperty(exports, "__esModule", { value: true });
const common_1 = require("@nestjs/common");
const http_exception_1 = require("./http.exception");
const http_helper_1 = require("./http.helper");
const http_constants_1 = require("./http.constants");
const http_interface_1 = require("./http.interface");
let HttpFetchService = HttpFetchService_1 = class HttpFetchService {
constructor(httpService, httpOption) {
this.httpService = httpService;
this.httpOption = httpOption;
const { logger, requestInterceptors = [], responseInterceptors = [] } = this.httpOption;
this.logger = logger || new common_1.Logger(HttpFetchService_1.name);
requestInterceptors.forEach(({ onFulfilled, onRejected }) => {
this.httpService.axiosRef.interceptors.request.use(onFulfilled, onRejected);
});
this.httpService.axiosRef.interceptors.response.use(response => response, error => {
const { response = {}, config = {} } = error;
this.logger.error(`Api request failed -> status: ${response.status}; url: ${config.url}; params: ${JSON.stringify(config.params || {})}; body: ${JSON.stringify(config.data || {})}; response: ${JSON.stringify(response.data)}`);
throw error;
});
responseInterceptors.forEach(({ onFulfilled, onRejected }) => {
this.httpService.axiosRef.interceptors.response.use(onFulfilled, onRejected);
});
}
async request(url, config = {}) {
config = config || {};
const protocol = this.httpOption.protocol || 'http';
if (url.indexOf(protocol) !== 0) {
url = `${protocol}://${url}`;
}
switch (this.httpOption.parameterStyle) {
case http_interface_1.ParameterStyle.CAMEL_TO_SNAKE:
if (config.data) {
config.data = http_helper_1.HttpHepler.humpToSnake(config.data);
}
if (config.params) {
config.params = http_helper_1.HttpHepler.humpToSnake(config.params);
}
break;
case http_interface_1.ParameterStyle.SNAKE_TO_CAMEL:
if (config.data) {
config.data = http_helper_1.HttpHepler.snakeToHump(config.data);
}
if (config.params) {
config.params = http_helper_1.HttpHepler.snakeToHump(config.params);
}
break;
default:
break;
}
let response, resp;
const stringParams = JSON.stringify(config.params || {});
const stringBody = JSON.stringify(config.data || {});
const start = new Date().getTime();
try {
resp = await this.httpService.axiosRef.request(Object.assign({}, this.httpOption, config, { url }));
url = resp.config.url;
this.logger.log(`Api request -> (${new Date().getTime() -
start}ms) url: ${url}; params: ${stringParams}; body: ${stringBody}`);
const data = resp.data;
let content = data.data;
if (this.httpOption.parameterStyle === http_interface_1.ParameterStyle.CAMEL_TO_SNAKE) {
content = http_helper_1.HttpHepler.snakeToHump(data.data || {});
}
else if (this.httpOption.parameterStyle === http_interface_1.ParameterStyle.SNAKE_TO_CAMEL) {
content = http_helper_1.HttpHepler.humpToSnake(data.data || {});
}
response = {
code: data.code || 0,
msg: data.msg || '',
data: content,
success: data.code === 600,
};
}
catch (err) {
this.logger.error(err.message);
if (!err.response.data) {
err.response.data = {};
}
if (!err.response.data.code && !err.response.data.data) {
throw new http_exception_1.HttpRequestApiException({
msg: err.message,
});
}
response = {
code: err.response.data.code || 0,
msg: err.response.data.msg || err.message,
data: err.response.data.data,
success: false,
};
}
return response;
}
async post(url, config) {
return this.request(url, Object.assign({}, config, { method: 'post' }));
}
async get(url, config) {
return this.request(url, Object.assign({}, config, { method: 'get' }));
}
async put(url, config) {
return this.request(url, Object.assign({}, config, { method: 'put' }));
}
async delete(url, config) {
return this.request(url, Object.assign({}, config, { method: 'delete' }));
}
async patch(url, config) {
return this.request(url, Object.assign({}, config, { method: 'patch' }));
}
async head(url, config) {
return this.request(url, Object.assign({}, config, { method: 'head' }));
}
};
HttpFetchService = HttpFetchService_1 = __decorate([
common_1.Injectable(),
__param(0, common_1.Inject(common_1.HttpService)),
__param(1, common_1.Inject(http_constants_1.HTTP_OPTION)),
__metadata("design:paramtypes", [common_1.HttpService, Object])
], HttpFetchService);
exports.HttpFetchService = HttpFetchService;
//# sourceMappingURL=http.service.js.map
;