0

我是节点和打字稿的新手。我正在开发一个节点库,该库可以使用另一个 rest API 来获取和发布数据。该库由/任何 UI 应用程序使用,以从 API 服务发送和接收数据。现在我的问题是,如何在库中维护特定于环境的配置?例如:

消费者调用GET /user 用户端在消费者端调用库中的方法来get data

但是,如果消费者在测试环境中调用用户端点,我希望库点击以下 API Url

用于测试http://api.test.userinformation.company.com/user
betahttp://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 来开始使用该库。如您所见,该类的构造函数接受一个环境。一旦我在库中有环境,我需要以某种方式加载 keys 的值API UrlAPIClientIdAPIClientSecret从构造函数中加载。我知道有两种方法可以做到这一点:

选项1

我可以执行类似this._configLoader.SetConfigVariables(environment)where configLoader.tsis a class 从 files() 加载特定配置值的操作{environment}.json,但这意味着我维护上述URL变量和相应的clientidclientsecret以便能够访问 json 文件中的 URL,我不应该这样做正在检查源代码控制。

选项 2

我可以使用dotenvnpm 包,并创建一个 .env 文件,在其中定义三个键,然后将值存储在部署配置中,该配置非常适合独立部署的应用程序,但这是一个库,不能自行运行在任何环境中。

选项 3

从消费者那里接受一个配置对象,也就是说库的消费者根据环境提供了URL、clientId和clientSecret供库访问,但为什么要把维护库必要变量的责任放在消费者?

请就如何最好地实现这一点提出建议。

4

1 回答 1

1

所以,我想我明白了。让我们调用我的库L,并使用库调用的应用程序C1和 API 来获取用户信息A。所有都是我们组织中的内部应用程序,并且具有 OAuth 设置以便能够进行通信,我们的信息安全团队为各个应用程序提供这些客户端 ID 和机密,所以我认为我在这里要明确的是:C1会请求他们自己的clientidclientsecret点击A's URLC1然后将三个配置值传递给库,库用于与A. 这同样适用于C2未来的一些人。

这意味着它L需要以某种方式接受一个完整的配置对象,其中包含来自消费者等的所有必需的配置C1C2

是的,这听起来像是正确的方法。该库只是一些按照它的指示执行的代码。在这种情况下,客户端必须从 infosec 团队获取 clientid 和 clientsecret 并维护它们并确保它们的安全,并且客户端还具有与它们一起使用的 URL。因此,客户端将所有这些都传递到您的库中,理想情况下每个实例只传递一次,然后在该实例的持续时间内将其保存在您的实例数据中

于 2020-04-27T05:55:02.990 回答