如何在环回中为API个请求动态绑定数据源
How to dynamically bind data sources for API requests in loopback
在这种情况下,不同的 api 请求必须根据请求的来源动态查询不同的数据库。例如,一个 api 请求必须同时查询 db1 中的用户 table 另一个 api 或具有不同源上下文的相同 api 必须查询来自 table 的用户数据库这可以为所有路由实现,除了 loopback 公开的默认路由。
我需要一个解决方案来将数据源动态绑定到环回公开的默认 apis,请记住它是一个单线程应用程序,以便将数据源绑定到 api 无论如何都不会影响应用程序并行提供的其他 api 个。
免责声明:我是 LoopBack 的合著者和当前维护者之一。
我的建议是为每个数据库创建一个 LoopBack 应用程序并编写一个自定义 Express 中间件,它将 API 请求路由到正确的 LoopBack 应用程序。
为了防止这些基于数据库的应用程序实例之间的交互,启用未记录的 "local registry" 模式至关重要,其中每个应用程序都有自己的本地模型注册表。 (默认情况下,LoopBack 使用全局模型注册表。)
请注意此功能并未广泛使用,您可能 运行 遇到不起作用的边缘情况。您最终可能会调试环回内部并发送拉取请求来解决这些问题。 (过去一两个用户已经发生过,因此大多数问题现在应该已经解决了。)
const app = loopback({localRegistry: true});
上面的代码将创建一个新的 LoopBack 应用程序,它不共享任何全局状态并且没有配置任何内置模型(没有用户、AccessToken 等)
这对 loopback-boot
非常有效,它可以准确加载在 server/model-config.json
中配置的那些内置模型。如果您从代码中手动加载模型,您可能希望将所有内置模型预加载到您的应用程序中。这可以通过 loadBuiltinModels
选项来实现:
const app = loopback({localRegistry: true, loadBuiltinModels: true});
现在我们知道如何创建一个不共享任何全局状态的应用程序,我们需要创建一个 LoopBack 应用程序注册表,每个数据库一个(这可以在第一次访问时延迟完成)。我将把这部分留作 reader 的练习。唯一重要的部分是在每个 per-database 应用程序上挂载 loopback.rest()
中间件,否则我们将无法在以后实现请求处理。
const app = loopback({localRegistry: true, loadBuiltinModels: true});
app.use(loopback.rest());
有了 LoopBack 应用程序的注册表,我们可以编写 Express 中间件来处理请求:
function handleApiRequest(req, res, next) {
const app = // obtain the LoopBack application instance to use
app(req, res, next);
}
// use the middleware in your root application, e.g.
const app = express();
app.use(cors({/*...*/});
app.use(handleApiRequest);
app.use(errorHandler({/*...*/});
在这种情况下,不同的 api 请求必须根据请求的来源动态查询不同的数据库。例如,一个 api 请求必须同时查询 db1 中的用户 table 另一个 api 或具有不同源上下文的相同 api 必须查询来自 table 的用户数据库这可以为所有路由实现,除了 loopback 公开的默认路由。 我需要一个解决方案来将数据源动态绑定到环回公开的默认 apis,请记住它是一个单线程应用程序,以便将数据源绑定到 api 无论如何都不会影响应用程序并行提供的其他 api 个。
免责声明:我是 LoopBack 的合著者和当前维护者之一。
我的建议是为每个数据库创建一个 LoopBack 应用程序并编写一个自定义 Express 中间件,它将 API 请求路由到正确的 LoopBack 应用程序。
为了防止这些基于数据库的应用程序实例之间的交互,启用未记录的 "local registry" 模式至关重要,其中每个应用程序都有自己的本地模型注册表。 (默认情况下,LoopBack 使用全局模型注册表。)
请注意此功能并未广泛使用,您可能 运行 遇到不起作用的边缘情况。您最终可能会调试环回内部并发送拉取请求来解决这些问题。 (过去一两个用户已经发生过,因此大多数问题现在应该已经解决了。)
const app = loopback({localRegistry: true});
上面的代码将创建一个新的 LoopBack 应用程序,它不共享任何全局状态并且没有配置任何内置模型(没有用户、AccessToken 等)
这对 loopback-boot
非常有效,它可以准确加载在 server/model-config.json
中配置的那些内置模型。如果您从代码中手动加载模型,您可能希望将所有内置模型预加载到您的应用程序中。这可以通过 loadBuiltinModels
选项来实现:
const app = loopback({localRegistry: true, loadBuiltinModels: true});
现在我们知道如何创建一个不共享任何全局状态的应用程序,我们需要创建一个 LoopBack 应用程序注册表,每个数据库一个(这可以在第一次访问时延迟完成)。我将把这部分留作 reader 的练习。唯一重要的部分是在每个 per-database 应用程序上挂载 loopback.rest()
中间件,否则我们将无法在以后实现请求处理。
const app = loopback({localRegistry: true, loadBuiltinModels: true});
app.use(loopback.rest());
有了 LoopBack 应用程序的注册表,我们可以编写 Express 中间件来处理请求:
function handleApiRequest(req, res, next) {
const app = // obtain the LoopBack application instance to use
app(req, res, next);
}
// use the middleware in your root application, e.g.
const app = express();
app.use(cors({/*...*/});
app.use(handleApiRequest);
app.use(errorHandler({/*...*/});