如何在回环中动态绑定API请求的数据源



以下是情况,其中不同的API请求必须根据请求的来源动态查询不同的数据库。例如,API请求必须同时查询DB1中的另一个API或具有不同原点上下文的同一API,必须从DB2查询用户表。除了通过loopback暴露的默认路线外,所有路由都可以实现。我需要一个解决方案,将数据源动态绑定到loopback暴露的默认API,请记住这是一个单个螺纹应用程序,以便将数据量绑定到API与API的绑定不应影响与其他API的行为,而其他API的行为则与之相似。应用程序。

免责声明:我是合作社,也是循环返还的当前维护者之一。

我的建议是为每个数据库创建一个回环应用程序,并编写一个自定义Express中间件,将API请求路由到正确的环回应用程序。

为了防止这些每个数据库应用程序实例之间的互动,至关重要的是启用无证件的"本地注册表"模式,在该模式下,每个应用程序都有自己的模型本地注册表。(默认情况下,环回使用全局模型注册表。(

请注意,此功能不广泛使用,您可能会遇到不起作用的边缘案例。您可能最终会调试回环内部内容并发送拉动请求以解决这些问题。(过去,它已经发生了一个或两个用户,因此大多数问题现在应该解决。(

const app = loopback({localRegistry: true});

上面的代码将创建一个不共享任何全局状态并且没有配置任何内置模型(没有用户,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());

有了"环回"应用程序注册表,我们可以编写Express Mondrware来处理请求:

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

最新更新