单独的模型定义和模型代码

时间:2018-04-23 13:47:02

标签: loopbackjs strongloop loopback

我希望重用.json - 模型的文件,并在不同的服务之间共享它们。这些服务有很多不同的问题,但希望在相同的数据结构上运行。为了避免重复工作和错误,我想将.json - Files放入一个包中,并将Javascript - Files与模型文件分别关联在每个项目中。例如:

仅用于.json定义的目录,可以在访问相同数据源的各种应用程序之间共享:

models 
- ModelA.json
- ModelB.json
- ...

每个应用程序一个具有应用程序特定逻辑的目录:

model-logic
- ModelA.js
- ModelB.js
- ...

如果我尝试使用loopback,可以找到模型文件,但除非Javascript文件位于同一目录中,否则它们与模型无关。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

免责声明:我是LoopBack的维护者,也是loopback-boot模块的作者。

在LoopBack中,我们有一组用于注册新模型的API,然后是一个传统的引导程序(loopback-boot模块),它定义了项目布局的约定,并调用LoopBack API来自动加载和定义来自JSON和JS的模型文件。正如您已经正确观察到的那样,loopback-boot假定JS和JSON文件位于同一位置。

为了支持每个应用程序想要定义自定义模型方法的情况,我想到的解决方案很少。

选项1:模型继承

您可以利用模型继承:

  • 共享模块(包)中定义的模型仅提供属性(数据模式)。
  • 对于每个共享模型,应用程序可以定义从共享模型继承的子类模型。 JSON文件可以非常简单(只需要继承的模型namebase模型名称,以及自定义方法的远程元数据)。

包含共享模型的包:

- 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.
}

选项2:按照您的方式加载模型

或者,您不必使用loopback-boot来设置应用程序运行时,您可以编写自己的常规引导程序。

以下是要使用的API:

  • 数据来源是通过app.dataSource(name, config)apidocs)定义的。为了定义数据源,loopback-boot基本上加载datasources.json并遍历所有顶级属性,调用app.dataSource(key, data[key])

  • 模型以多个步骤加载:

    1. 如果您使用的是mixins,则需要先加载它们。该API未在app级别展示,您必须致电app.registry.modelBuilder.mixins.define(fn)source)。

    2. 首先需要通过调用app.registry.createModel(config)来定义模型,其中config参数设置为模型JSON文件的内容。

    3. 获得模型构造函数后,需要将其附加到数据源,并通过调用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的配置选项。)