如何在环回

时间:2018-04-26 11:50:51

标签: node.js rest express datasource loopbackjs

这是一种情况,其中不同的api请求必须基于请求的来源动态地查询不同的数据库。例如,api请求必须同时查询db1中的users表,另一个api或具有不同源上下文的相同api必须从db2查询users表。除了通过环回公开的默认路由之外,所有路由都可以实现。 我需要一个解决方案来动态地将dataSources绑定到loopback公开的默认api,记住它是一个单线程应用程序,因此将dataSource绑定到api不应该影响由其并行提供的其他api的行为。应用

1 个答案:

答案 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({/*...*/});