Используйте JavaScript Proxy для добавления значения к аргументу - PullRequest
0 голосов
/ 28 октября 2018

Я использую 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;

Что я положу в два прокомментированных раздела?

Я мог бы создать новый Прокси второго уровня для каждого определенного маршрута, который обрабатывал это, но ради чистоты / простоты я хотел бы использовать только один прокси.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...