loopback4 应用程序中数据源的环境特定配置
Environment specific configuration of datasources in loopback4 application
我刚刚开始了我的第一个环回项目,并为应用程序选择了 loopback4 版本。它纯粹是一个服务器应用程序,它将与数据库(Redis 和 mongodb)交互,并且由于微服务架构将调用外部 API 服务。
现在,我的应用程序中有 3 个数据源,即 mongodb、Redis 和基于 REST 的数据源来调用外部服务。我在前进的过程中面临 2 个问题。
1.数据源的环境特定配置: 我需要根据 NODE_ENV 环境变量维护所有三个数据源的配置。对于 lb3,我找到了这个解决方案,
https://loopback.io/doc/en/lb3/Environment-specific-configuration.html#data-source-configuration
这在 lb4 中不起作用。一种解决方案是在目录 src/datasources
中添加名称为 mongodb.staging.json
和 mongodb.production.json
且与 redis 和 rest 数据源相同的配置文件,并使用 if 条件根据 NODE_ENV 变量加载此配置并将其传递给数据源的构造函数。它可以工作,但看起来不太好,因为它应该是应用程序的责任。
有人可以为我推荐 lb3 等效解决方案吗?
2。通过数据源调用外部 APIs: 在 lb4 中,要调用外部服务,建议使用单独的基于 REST 的数据源及其服务以通过控制器调用它。现在,在 REST 数据源配置中,必须定义将发生在外部服务 https://loopback.io/doc/en/lb4/REST-connector.html#defining-a-custom-method-using-a-template 上的所有 API 调用的模板。
由于我的应用程序大量调用外部服务,请求参数比较多。使用其请求参数声明每个 API 调用并在特定于环境的数据源配置中维护它变得非常混乱。
有人可以告诉我上述问题的更强大、更清晰的替代方案吗?
提前致谢!!
在数据源配置中使用环境变量
数据源配置只是一个导入 *.datasource.ts
的 JSON 文件。因此,您可以将 JSON 文件替换为 Typescript 文件并相应地导入它。 LoopBack 4 不提供任何自定义变量替换机制。相反,建议使用 process.env
.
最近的 CLI 版本替换了 JSON 配置以支持使用单个 Typescript 文件:
import {inject} from '@loopback/core';
import {juggler} from '@loopback/repository';
const config = {
name: 'db',
connector: 'memory',
};
export class DbDataSource extends juggler.DataSource {
static dataSourceName = 'db';
static readonly defaultConfig = config;
constructor(
@inject('datasources.config.db', {optional: true})
dsConfig: object = config,
) {
super(dsConfig);
}
}
构造函数中的依赖项注入允许您通过应用程序的 IoC 容器以编程方式覆盖配置。
进一步阅读
在没有 REST 连接器的情况下调用外部 API 秒
REST 连接器强制执行定义明确的接口来查询外部 API,以便能够在发送请求之前进行验证。
如果这不是有利的,可以创建一个新的 Service 作为 HTTP 查询的包装器。从那里,您可以公开自己的函数来处理对外部 API 的请求。由于服务不需要遵循严格的结构,因此可以根据您的用例对其进行自定义。
也可以使用内置或外部库直接在控制器内部创建新请求。
总的来说,在 LoopBack 4 中做某些事情并没有 100% 正确或错误的方法。因此,为什么该框架提供了多种方法来解决同一问题。
我刚刚开始了我的第一个环回项目,并为应用程序选择了 loopback4 版本。它纯粹是一个服务器应用程序,它将与数据库(Redis 和 mongodb)交互,并且由于微服务架构将调用外部 API 服务。
现在,我的应用程序中有 3 个数据源,即 mongodb、Redis 和基于 REST 的数据源来调用外部服务。我在前进的过程中面临 2 个问题。
1.数据源的环境特定配置: 我需要根据 NODE_ENV 环境变量维护所有三个数据源的配置。对于 lb3,我找到了这个解决方案,
https://loopback.io/doc/en/lb3/Environment-specific-configuration.html#data-source-configuration
这在 lb4 中不起作用。一种解决方案是在目录 src/datasources
中添加名称为 mongodb.staging.json
和 mongodb.production.json
且与 redis 和 rest 数据源相同的配置文件,并使用 if 条件根据 NODE_ENV 变量加载此配置并将其传递给数据源的构造函数。它可以工作,但看起来不太好,因为它应该是应用程序的责任。
有人可以为我推荐 lb3 等效解决方案吗?
2。通过数据源调用外部 APIs: 在 lb4 中,要调用外部服务,建议使用单独的基于 REST 的数据源及其服务以通过控制器调用它。现在,在 REST 数据源配置中,必须定义将发生在外部服务 https://loopback.io/doc/en/lb4/REST-connector.html#defining-a-custom-method-using-a-template 上的所有 API 调用的模板。
由于我的应用程序大量调用外部服务,请求参数比较多。使用其请求参数声明每个 API 调用并在特定于环境的数据源配置中维护它变得非常混乱。
有人可以告诉我上述问题的更强大、更清晰的替代方案吗?
提前致谢!!
在数据源配置中使用环境变量
数据源配置只是一个导入 *.datasource.ts
的 JSON 文件。因此,您可以将 JSON 文件替换为 Typescript 文件并相应地导入它。 LoopBack 4 不提供任何自定义变量替换机制。相反,建议使用 process.env
.
最近的 CLI 版本替换了 JSON 配置以支持使用单个 Typescript 文件:
import {inject} from '@loopback/core';
import {juggler} from '@loopback/repository';
const config = {
name: 'db',
connector: 'memory',
};
export class DbDataSource extends juggler.DataSource {
static dataSourceName = 'db';
static readonly defaultConfig = config;
constructor(
@inject('datasources.config.db', {optional: true})
dsConfig: object = config,
) {
super(dsConfig);
}
}
构造函数中的依赖项注入允许您通过应用程序的 IoC 容器以编程方式覆盖配置。
进一步阅读
在没有 REST 连接器的情况下调用外部 API 秒
REST 连接器强制执行定义明确的接口来查询外部 API,以便能够在发送请求之前进行验证。
如果这不是有利的,可以创建一个新的 Service 作为 HTTP 查询的包装器。从那里,您可以公开自己的函数来处理对外部 API 的请求。由于服务不需要遵循严格的结构,因此可以根据您的用例对其进行自定义。
也可以使用内置或外部库直接在控制器内部创建新请求。
总的来说,在 LoopBack 4 中做某些事情并没有 100% 正确或错误的方法。因此,为什么该框架提供了多种方法来解决同一问题。