我是节点和打字稿的新手。我正在开发一个节点库,该库可以使用另一个 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 Url,APIClientId并APIClientSecret从构造函数中加载。我知道有两种方法可以做到这一点:
选项1
我可以执行类似this._configLoader.SetConfigVariables(environment)where configLoader.tsis a class 从 files() 加载特定配置值的操作{environment}.json,但这意味着我维护上述URL变量和相应的clientid,clientsecret以便能够访问 json 文件中的 URL,我不应该这样做正在检查源代码控制。
选项 2
我可以使用dotenvnpm 包,并创建一个 .env 文件,在其中定义三个键,然后将值存储在部署配置中,该配置非常适合独立部署的应用程序,但这是一个库,不能自行运行在任何环境中。
选项 3
从消费者那里接受一个配置对象,也就是说库的消费者根据环境提供了URL、clientId和clientSecret供库访问,但为什么要把维护库必要变量的责任放在消费者?
请就如何最好地实现这一点提出建议。