Использование класса es6 для расширения Axios
Я интересуюсь созданием обертки API и расширением от axios, используя классы es6. Как это возможно? В Axios есть метод.create(), который позволяет генерировать новый объект Axios.
class Api extends Axios {
constructor(...args){
super(..args)
this.defaults.baseURL = 'https://api.com'
}
cancelOrder (id) {
return this.put(`/cancel/order/${id}`)
}
}
Я знаю, что у меня есть доступ к этому let instance = axios.create()
,
Какие-нибудь мысли?
Попытка 1
import axios from 'axios'
const Axios = axios.create()
class Api extends Axios {
constructor (...args) {
super(...args)
this.defaults.baseURL = 'https://api.com'
}
cancelOrder (id) {
return this.put(`/cancel/order/${id}`)
}
}
let api = new Api()
api.cancelOrder('hi')
.then(console.log)
.catch(console.log)
Попытка 2
import axios from 'axios'
class Axios {
constructor () {
return axios.create()
}
}
class Api extends Axios {
constructor () {
super()
this.defaults.baseURL = 'https://api.com'
}
cancelOrder (id) {
return this.put(`/cancel/order/${id}`)
}
}
let api = new Api()
console.log(api.__proto__)
api.cancelOrder('hi')
.then(console.log)
.catch(console.log)
6 ответов
axios
в настоящее время не экспортирует Axios
объект, который он использует внутри.
.create()
Метод только создает экземпляр нового экземпляра.
// Factory for creating new instances
axios.create = function create(defaultConfig) {
return new Axios(defaultConfig);
};
Я создал PR, который экспортирует Axios
учебный класс.
https://github.com/reggi/axios/commit/7548f2f79d20031cd89ea7c2c83f6b3a9c2b1da4
И проблема GitHub здесь:
Если вы посмотрите на исходный код axios, они, кажется, не выставляют "класс" для Axios
только экземпляр.
Я не верю, что экземпляр объекта может быть расширен в es6.
Ваша вторая попытка кажется наиболее жизнеспособной, но если вы хотите подражать каждому axios
метод, у вас может быть много накладных расходов.
import axios, { Axios } from 'axios';
class Api extends Axios {
constructor () {
super()
this.defaults.baseURL = 'https://api.com'
}
cancelOrder (id) {
return this.put(`/cancel/order/${id}`)
}
}
Я также хотел создать класс, который позволил бы мне создавать несколько экземпляров с предопределенными значениями по умолчанию. Вот мое решение.
import axios from 'axios'
export class Axios {
constructor() {
return axios.create({
baseURL: 'http://127.0.0.1:8080/',
headers: {
Authorization: 'AUTH TOKEN FROM INSTANCE',
'Content-Type': 'application/json',
},
})
}
}
const db = new Axios()
db.get('/your_url').then().catch()
Что ж, во многих ответах говорится, что класс «Axios» не экспортируется из пакета axios, но это неверно, по крайней мере, для версии 0.26.0. Что ж, если вы хотите создать экземпляр Axios самостоятельно и настроить его по своему желанию, это довольно просто. Я создал пример, используя машинописный текст, не стесняйтесь использовать его, если хотите.
import { Axios, AxiosRequestConfig } from "axios";
class AxiosService<D = any> extends Axios {
constructor(config?: AxiosRequestConfig<D>) {
super(config);
this.defaults.baseURL = 'https://api.com'
this.interceptors.request.use(interceptorConfig => {
// Set up your default interceptor behavior here for requests, if you want
}
);
this.interceptors.response.use(
response => {
return response;
},
error => {
// Same thing here, set the behavior for onError responses
}
);
}
cancelOrder (id) {
return this.put(`/cancel/order/${id}`)
}
}
/*
Here you can choose between exporting the class or a instance of it
in my case i just want to export the instance with some default config
and use it, you may ask yourself why that's because i want to centrilize
the configs on one axios instance instead of multiple instances.
*/
const axiosInstance = new AxiosService({
// You may want to set this so axios automatically parse your data to a object.
transformResponse: res => {
return JSON.parse(res);
},
headers: { "Access-Control-Allow-Origin": "true" },
});
export { axiosInstance };