Введение
Я создаю оболочку 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"?Это то, чего я пытаюсь избежать, но не хочу, чтобы в конечном итоге я делал что-то странное.Есть ли лучший способ сделать это вообще?