Получение информации об аутентификации из req.headers, создание экземпляра «класса API» и присоединение его к res.locals ... как лучше структурировать методы класса? - PullRequest
0 голосов
/ 10 февраля 2019

Введение

Я создаю оболочку API для системы тикетов в Express.Я полагаю, что его можно определить как прокси-сервер API CORS, где я пишу некоторые пользовательские вызовы API, а также использую некоторые базовые, которые предоставляет система создания билетов.

Мое приложение Express использует мое специальное промежуточное ПО, где я беру определенныепеременные из req.headers и использовать их для создания экземпляра класса.Я поместил только что созданный класс в res.locals и извлек его в каждом маршруте для выполнения вызовов API.Если бы я этого не делал, я бы продублировал много кода, извлекая req.headers на каждом маршруте и передавая значения в каждую создаваемую мной функцию API.

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

Базовый код

У меня есть ticketingsystem.js, где я создаю «базовый API» для взаимодействия, поэтому я неприходится повторять это каждый раз:

const axios = require("axios");

const API_URL = `/v4_6_release/apis/3.0/`;

const Tickets = require("./service/Tickets");

class TicketingSystem {
  constructor(props) {
    this.authKey = props.authKey;
    this.URL = props.URL;
    this.api_URL = props.API_URL || API_URL;
    this.rootAPI = axios.create({
      baseURL: `https://${this.URL}/v4_6_release/apis/3.0/`,
      headers: {
        Authorization: `${this.authKey}`,
        "Content-Type": "application/json"
      },
      timeout: 5000
    });
    this.tickets = new Tickets({ self: this });
  }
  api(REQUEST_CONFIG) {
    return this.rootAPI(REQUEST_CONFIG)
      .then(response => {
        this.logSuccess(response.status, REQUEST_CONFIG);
        return response;
      })
      .catch(e => {
        this.handleError(e, REQUEST_CONFIG);
      });
  }
// ... methods logSuccess and handleError... //
}

Класс Tickets в последней строке конструктора имеет вид Tickets.js:

class Tickets {
  constructor(props) {
    this.get = () => {
      const REQUEST_CONFIG = { method: "GET", url: `/service/tickets/` };
      return props.self.api(REQUEST_CONFIG);
    };
    this.getByID = id => {
      const REQUEST_CONFIG = {
        method: "GET",
        url: `/service/tickets/${id}/`
      };
      return props.self.api(REQUEST_CONFIG);
    };
  }
}

module.exports = Tickets;

Результат

Все это позволяет мне создать маршрут, который выглядит примерно так (просто в качестве примера):

// ...Middleware to create new obj from class TicketingSystem() and storing in res.locals.api... //

app.get("/", async (req, res) => {
  const API = res.locals.api;
  try {
    const result = await API.tickets.getByID("340294");
    res.send(JSON.stringify(result.data));
  } catch (e) {
    res.sendStatus(e);
  }
});

const API = res.locals.api - это удаление класса, созданного в промежуточном программном обеспечении, и использование методаприкреплен к нему: API.tickets.getByID()

Мой вопрос

Нормально ли писать это так, как я пишу?То есть:

  • Общая структура использования классов для создания объекта API при каждом запросе Express
  • Использование классов в классах для методов API.

Если так, то также кажется "хакерским" использование this.tickets = new Tickets({self: this}); в "базовом API" и props.self.api в коде "Tickets".

Должен ли я вместо этого просто иметь гигантский кусок методов на"базовый API"?Это то, чего я пытаюсь избежать, но не хочу, чтобы в конечном итоге я делал что-то странное.Есть ли лучший способ сделать это вообще?

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