Среда библиотеки машинописи узлов задает конфигурацию c - PullRequest
0 голосов
/ 27 апреля 2020

Я новичок в узле и машинописи. Я работаю над созданием библиотеки узлов, которая обращается к другому API отдыха для получения и публикации данных. Эта библиотека используется любым приложением пользовательского интерфейса для отправки и получения данных из службы API. Теперь мой вопрос: как мне поддерживать конфигурацию среды c в библиотеке? Например:

Потребительские вызовы GET /user Конечная точка пользователя на стороне потребителя вызывает метод в библиотеке для get data

Но если потребитель вызывает тестовую конечную точку пользователя Я хочу, чтобы библиотека использовала следующий URL-адрес API

для теста http://api.test.userinformation.company.com/user
для бета-версии http://api.beta.userinformation.company.com/user

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

Примечание : URL-адрес - не единственная проблема, я могу решить, что с помощью переключателя среды в библиотеке у меня есть некоторые клиентские секреты, основанные на средах, которые я не могу ни сохранить в коде, ни вернуть в систему контроля версий.

Дополнительная информация

(согласно запросу jfriend00 в комментариях)

В моей библиотеке есть класс LibExecutionEngine и один метод, который является точкой входа в библиотеку:

export class LibExecutionEngine implements ExecutionEngine {
    constructor(private environment: Environments, private trailLoader: 
    TrailLoader) {}

        async GetUserInfo(
            userId: string,
            userGroupVersion: string
            ): Promise<UserInfo> {
               return this.userLoader.loadUserInfo(userId, userGroupVersion)
        }
}

export interface ExecutionEngine {
    GetUserInfo(userId: string, userGroupVersion: string): Promise<UserInfo>

}

Потребитель начинает использовать библиотеку, создав экземпляр LibraryExecution и затем вызвав, например, getuserinfo. Как видите, конструктор для класса принимает среду. Когда у меня есть среда в библиотеке, мне нужно каким-то образом загрузить значения для ключей API Url, APIClientId и APIClientSecret из конструктора. Я знаю два способа сделать это:

Вариант 1

Я мог бы сделать что-то вроде this._configLoader.SetConfigVariables(environment), где configLoader.ts - это класс, который загружает указанные значения конфигурации c из файлов ( {environment}.json), но это означало бы, что я поддерживаю вышеупомянутые переменные URL и соответствующие clientid, clientsecret, чтобы иметь возможность попадать в URL в файле json, который я не должен проверять, чтобы управление исходным кодом.

Вариант 2

Я мог бы использовать пакет dotenv npm и создать один файл .env, в котором я определяю три ключа, а затем значения сохраняются в развертывании конфигурация, которая отлично работает для независимо развертываемого приложения, но это библиотека и не запускается сама по себе ни в какой среде.

Опция 3

Принимать объект конфигурации от потребителя, что означает что потребитель библиотеки предоставляет URL, clientId и clientSecret на основе среды для доступа к библиотеке, но зачем возлагать ответственность за поддержание необходимого v ariables для библиотеки нужно поставить на потребителя?

Подскажите, пожалуйста, как лучше всего это реализовать.

1 Ответ

1 голос
/ 27 апреля 2020

Итак, я думаю, что получил некоторую ясность. Позволяет вызывать мою библиотеку L, а также приложение-приложение C1 и API, который библиотека вызывает для получения информации о пользователе как A. Все они являются внутренними приложениями в нашей организации и имеют настройку OAuth для связи, наша команда infose c предоставляет данные клиентов и секреты для отдельных приложений, поэтому я думаю, что моя ясность здесь такова: C1 запросит свои собственные clientid и clientsecret для нажатия A URL, C1 передаст в библиотеку три значения конфигурации, которые библиотека использует для связи с A. То же самое относится к некоторым C2 в будущем.

Это означало бы, что L каким-то образом нужно принять полный объект конфигурации со всеми необходимыми значениями конфигурации от его потребителей C1, C2 et c.

Да, это похоже на правильный подход. Библиотека - это просто некоторый код, делающий то, что ей говорят. В этом случае именно клиент должен был выбрать клиентскую группу и clientsecret из команды infose c и поддерживать их, обеспечивать их безопасность, и у клиента также есть URL, который идет с ними. Итак, клиент передает все это в вашу библиотеку, в идеале, только один раз за экземпляр, а затем вы сохраняете это в данных вашего экземпляра на время действия этого экземпляра

...