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

Loopbackjs 单独的模型定义和模型代码,loopbackjs,strongloop,loopback,Loopbackjs,Strongloop,Loopback,我希望重用模型的.json文件,并在不同的服务之间共享它们。这些服务有非常不同的关注点,但希望在相同的数据结构上运行。为了避免重复工作和错误,我想将.json文件放入一个包中,并在每个项目中将Javascript文件分别与模型文件关联。例如: 仅用于.json定义的目录,可在访问同一数据源的各种应用程序之间共享: models - ModelA.json - ModelB.json - ... 每个应用程序都有一个具有应用程序特定逻辑的目录: model-logic - ModelA.js

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

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

models 
- ModelA.json
- ModelB.json
- ...
每个应用程序都有一个具有应用程序特定逻辑的目录:

model-logic
- ModelA.js
- ModelB.js
- ...
如果我尝试使用环回,可以找到模型文件,但除非Javascript文件位于同一目录中,否则它们不会与模型关联。有什么方法可以做到这一点吗?

免责声明:我是环回的维护者,也是环回启动模块的作者

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

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

选项1:模型继承 您可以利用模型继承:

  • 共享模块(包)中定义的模型仅提供属性(数据架构)
  • 对于每个共享模型,应用程序可以定义从共享模型继承的子类模型。JSON文件可以非常简单(只需继承模型
    name
    base
    模型名,还可以为自定义方法远程处理元数据)
包含共享模型的包:

- BaseModelA.json
- (empty BaseModelA.js that can be omitted)
- BaseModelB.json
- (empty BaseModelB.js that can be omitted)
- ...
在您的应用程序中,让我们从ModelB继承创建ModelA并添加其他行为:

  • common/models/ModelA.json

    {
      "name": "ModelA",
      "base": "BaseModelA",
    }
    
  • 通用/models/ModelA.js

    'use strict';
    
    module.exports = function(ModelA) {
      // place your code here
    }
    
缺少的部分是告诉loopbackboot在共享包中查找模型。假设您的包名为“models”,包含
common/models
目录中的模型,并安装到
node\u modules/models
,您需要编辑
服务器/model config.json
,如下所示:

{
  "_meta": {
    "sources": [
      "loopback/common/models",
      "loopback/server/models",
      "models/common/models", // <-- ADD THIS LINE
      "../common/models",
      "./models"
    ],
    // etc.
  },
  // etc.
}

(以上示例适用于
环回-boot@2.x
,我不熟悉新版本
环回的配置选项-boot@3.x

在我们的例子中,继承并没有减少很多工作量,而且代码有些臃肿。我试了一下,发现它不讨人喜欢。我阅读了loopback3.x方式的源代码(这就是我们正在使用的)。在compiler.js方法中,您可以看到model.js文件预期与model.json文件共定位。我对以这种方式“修补”框架持怀疑态度。根据我的经验,这对于升级来说是非常脆弱的。然而,在这种情况下,这可能是我们唯一可以权衡复制和粘贴的选项。我希望model-config.json文件中有一个高级选项,可以将.json文件与.js文件链接起来。我认为这样做的努力是可以控制的。类似“modelCodeDirectory”的东西。您认为可以将其添加到功能列表中吗?@IonTichy我担心StackOverflow在本次讨论中是不切实际的,您能否在中打开一个问题并提及我的GitHub句柄(bajtos),以便我收到通知?
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.