免责声明:我是 LoopBack 的维护者,也是 loopback-boot 模块的作者。
在 LoopBack 中,我们有一组用于注册新模型的 API,然后是一个传统的引导程序(loopback-boot 模块),它定义了项目布局的约定并调用 LoopBack API 以自动从 JSON 和 JS 加载和定义模型文件。正如您正确观察到的,loopback-boot 假定 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",
}
-
common/models/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:
要加载剩余的工件(应用配置、中间件配置、组件等),最好继续使用 loopback-boot。只需告诉引导程序没有要加载的模型或数据源即可。
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的配置选项不太熟悉。)