这是一种情况,其中不同的api请求必须基于请求的来源动态地查询不同的数据库。例如,api请求必须同时查询db1中的users表,另一个api或具有不同源上下文的相同api必须从db2查询users表。除了通过环回公开的默认路由之外,所有路由都可以实现。 我需要一个解决方案来动态地将dataSources绑定到loopback公开的默认api,记住它是一个单线程应用程序,因此将dataSource绑定到api不应该影响由其并行提供的其他api的行为。应用
答案 0 :(得分:1)
免责声明:我是LoopBack的共同作者和当前维护者之一。
我的建议是为每个数据库创建一个LoopBack应用程序,并编写一个自定义Express中间件,将API请求路由到正确的LoopBack应用程序。
为了防止这些每个数据库应用程序实例之间的交互,启用未记录的“本地注册表”模式至关重要,其中每个应用程序都有自己的本地模型注册表。 (默认情况下,LoopBack使用全局模型注册表。)
请注意,此功能未得到广泛使用,您可能遇到无效的边缘情况。您可能最终调试环回内部并发送拉取请求来解决这些问题。 (过去已经发生过一两个用户,因此现在应该修复大多数问题。)
const app = loopback({localRegistry: true});
上面的代码将创建一个新的LoopBack应用程序,该应用程序不共享任何全局状态,并且没有配置任何内置模型(没有User,AccessToken等)
这适用于loopback-boot
,它正好加载server/model-config.json
中配置的内置模型。如果您从代码手动加载模型,您可能希望将所有内置模型预加载到您的应用程序。这可以通过loadBuiltinModels
选项实现:
const app = loopback({localRegistry: true, loadBuiltinModels: true});
现在我们知道如何创建一个不共享任何全局状态的应用程序,我们需要为每个数据库创建一个LoopBack应用程序注册表(这可以在第一次访问时懒得完成)。我将把这部分作为练习留给读者。唯一重要的部分是在每个每个数据库的应用程序上安装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({/*...*/});