Я использую Axios для работы с моим REST API. API обслуживает несколько приложений с маршрутами вида /api/<app>/...
.
В моем клиенте приложения "mp" я постоянно повторяю строку Axios.[rest-method]('/api/mp/[...]', ...)
. Я думал, что разумный способ избежать этого - завернуть Аксиоса в Proxy
. С этим прокси-объектом я мог делать свои вызовы, например Axios.mp.get(...)
, и он автоматически добавлял бы /api/mp
к первому аргументу get()
.
Очевидно, я мог бы создать свой собственный объект-обертку с помощью обернутых методов REST, которые это делали, но где в этом удовольствие?
Вот что у меня есть:
import AxiosLib from 'axios';
const routes = {
mp: '/api/mp',
// ...
},
restMethods = new Set([
'get',
'post',
'put',
'delete',
'head',
'patch'
]);
const Axios = new Proxy(AxiosLib, {
get: function(target, prop, receiver) {
let routePrefix = routes[prop];
if (routePrefix) {
// return `receiver` with magic to store `routePrefix`
} else if (restMethods.has(prop)) {
let method = Reflect.get(target, prop, receiver);
routePrefix = /* get magically stored `routePrefix` if it exists */ || '';
return function(url, ...args) {
return method.apply(this, routePrefix + url, ...args);
}
} else {
return Reflect.get(target, prop, receiver);
}
}
});
export default Axios;
Что я положу в два прокомментированных раздела?
Я мог бы создать новый Прокси второго уровня для каждого определенного маршрута, который обрабатывал это, но ради чистоты / простоты я хотел бы использовать только один прокси.