我希望重用.json - 模型的文件,并在不同的服务之间共享它们。这些服务有很多不同的问题,但希望在相同的数据结构上运行。为了避免重复工作和错误,我想将.json - Files放入一个包中,并将Javascript - Files与模型文件分别关联在每个项目中。例如:
仅用于.json定义的目录,可以在访问相同数据源的各种应用程序之间共享:
models
- ModelA.json
- ModelB.json
- ...
每个应用程序一个具有应用程序特定逻辑的目录:
model-logic
- ModelA.js
- ModelB.js
- ...
如果我尝试使用loopback,可以找到模型文件,但除非Javascript文件位于同一目录中,否则它们与模型无关。有没有办法实现这个目标?
答案 0 :(得分:1)
免责声明:我是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在共享包中寻找模型。假设您的包被称为" models",包含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])
。
模型以多个步骤加载:
如果您使用的是mixins,则需要先加载它们。该API未在app
级别展示,您必须致电app.registry.modelBuilder.mixins.define(fn)
(source)。
首先需要通过调用app.registry.createModel(config)
来定义模型,其中config
参数设置为模型JSON文件的内容。
获得模型构造函数后,需要将其附加到数据源,并通过调用app.model(ModelCtor, config)
通过REST API公开它。 config
参数包含server/model-config.json
文件中的模型配置,例如{dataSource: 'db', public: true}
。
要加载剩余的工件(app config,中间件配置,组件等),最好继续使用loopback-boot。告诉bootstrapper没有要加载的模型或数据源。
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.
(上面的示例适用于loopback-boot@2.x
,我不熟悉新版本loopback-boot@3.x
的配置选项。)