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

于尔根·西蒙(JürgenSimon)

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

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

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

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

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

如果我尝试使用环回,则可以找到模型文件,但是除非Javascript文件位于同一目录中,否则它们不会与模型关联。有没有办法可以做到这一点?

米罗斯拉夫·巴托什(MiroslavBajtoš)

免责声明:我是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在共享包中查找模型。假设您的软件包称为“模型”,包含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. 如果您使用的是mixin,则需要先加载它们。该API尚未公开app,您必须调用app.registry.modelBuilder.mixins.define(fn)source)。

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

    3. 有了模型构造函数后,您需要将其附加到数据源,并通过调用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章