我希望重用.json-模型文件,并在不同服务之间共享它们。这些服务有非常不同的关注点,但希望在相同的数据结构上运行。为了避免重复劳动和错误,我想将.json-文件放入一个包中,并将Javascript-文件与每个项目中的模型文件分别关联。例:
仅用于.json定义的目录,可以在访问同一数据源的各种应用程序之间共享:
models
- ModelA.json
- ModelB.json
- ...
每个应用程序具有应用程序特定逻辑的目录:
model-logic
- ModelA.js
- ModelB.js
- ...
如果我尝试使用环回,则可以找到模型文件,但是除非Javascript文件位于同一目录中,否则它们不会与模型关联。有没有办法可以做到这一点?
免责声明:我是LoopBack的维护者和Loopback-boot模块的作者。
在LoopBack中,我们有一组用于注册新模型的API,然后是一个常规的引导程序(loopback-boot模块),它定义了项目布局的约定,并调用LoopBack API从JSON和JS文件自动加载和定义模型。正如您已经正确观察到的那样,loopback-boot假定JS和JSON文件都位于同一位置。
为了支持每个应用程序都希望定义自定义模型方法的情况,我想到的解决方案很少。
您可以利用模型继承:
name
和base
模型名称,再加上自定义方法的远程处理元数据)。包含共享模型的软件包:
- BaseModelA.json
- (empty BaseModelA.js that can be omitted)
- BaseModelB.json
- (empty BaseModelB.js that can be omitted)
- ...
在您的应用中,让我们创建从ModelB继承并添加其他行为的ModelA:
通用/模型/ModelA.json
{
"name": "ModelA",
"base": "BaseModelA",
}
通用/模型/ModelA.js
'use strict';
module.exports = function(ModelA) {
// place your code here
}
缺少的部分是告诉loopback-boot在共享包中查找模型。假设您的软件包称为“模型”,包含common/models
目录中的模型并安装到node_modules/models
,则需要进行server/model-config.json
如下编辑:
{
"_meta": {
"sources": [
"loopback/common/models",
"loopback/server/models",
"models/common/models", // <-- ADD THIS LINE
"../common/models",
"./models"
],
// etc.
},
// etc.
}
另外,您不必使用loopback-boot来设置应用程序运行时,则可以编写自己的常规引导程序。
以下是要使用的API:
数据源通过app.dataSource(name, config)
(apidocs)定义。要定义数据源,loopback-boot本质上会加载datasources.json
和遍历所有顶级属性,并调用app.dataSource(key, data[key])
。
模型分多个步骤加载:
如果您使用的是mixin,则需要先加载它们。该API尚未公开app
,您必须调用app.registry.modelBuilder.mixins.define(fn)
(source)。
首先需要通过调用定义模型app.registry.createModel(config)
,其中config
parameter设置为模型JSON文件的内容。
有了模型构造函数后,您需要将其附加到数据源,并通过调用REST API通过REST API公开它app.model(ModelCtor, config)
。该config
参数包含来自server/model-config.json
文件的模型配置,例如{dataSource: 'db', public: true}
。
要加载其余工件(应用程序配置,中间件配置,组件等),最好继续使用回送引导。只需告诉引导程序,就没有模型或数据源可加载。
const app = loopback();
// 1. load your datasources and models
// (TODO)
// 2. use loopback-boot to do the rest
boot(
app,
{
appRootDir: __dirname,
models: {},
dataSources: {},
modelSources: [],
mixinSources: [],
});
// etc.
(上面的示例用于[email protected]
,我不熟悉新版本的配置选项[email protected]
。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句