StrongLoop:如何在loopback.boot()时间在models/directory中定义模型



在Loopback文档初始化应用程序中,有两件事:

第一:

Loopback.boot()基于json定义文件加载数据源和模型,或者给定的选项,然后,从模型/引导/目录加载所有js文件

然后:

"不要将app.boot()和app.model(name,config)组合为多个文件,因为这可能会导致由于竞争条件而未定义模型。为了避免在使用app.boot()时出现这种情况,请确保所有模型都作为一部分传递模型定义。">

这两者看起来不矛盾吗?

我有很多模型要定义,我不想在一个巨大的json文件中定义这些模型,因此希望在所述models/目录中为每个模型放置一个js文件,以便在引导时加载。

目前,我所做的是在models/ExampleModel.js中定义一个类似的模型:

var properties = {
fieldOne: { type: String, required: true },
otherField: { type: Number }
};
var options = {
relations: {
collections: {
type: "belongsTo",
model: "user"
}
}
};
var Model = require('loopback').Model;
module.exports = Model.extend('ExampleModel', properties, options);

问题是:在boot()期间,模型被加载,但没有附加到应用程序或任何数据源。它不暴露于REST API。

我尝试在models.json中添加一个小组件来启用应用程序中的模型:

"examplemodel": {
"options": {
"base": "ExampleModel"
},
"dataSource": "db",
"public": true
}

它不起作用,Loopback抛出Class not found异常。

我还考虑过使用app.model()而不是Model.extend(),但我不知道如何访问所需型号js文件中的app

问题:如何在models/目录中定义模型,并将其附加到应用程序、数据源和RESTneneneba API,同时仍然依赖所有boot()机制

我也想过使用app.model()而不是model.extend(),但我不知道如何访问所需模型js文件中的应用程序。

如果使用slc lb project构建项目,则应用程序对象应通过主app.js文件导出。

所以你可以通过这种方式获得应用程序对象:

// in models/example-model.js
var app = require('../app.js')

一旦你有了应用程序对象,你就可以正确地调用app.model

var properties = {
fieldOne: { type: String, required: true },
otherField: { type: Number }
};
var options = {
relations: {
collections: {
type: "belongsTo",
model: "user"
}
}
};
app.model('ExampleModel', {
properties: properties, 
options: options,
dataSource: 'db' // replace with the correct name
);
// you can access the model now via
//   app.models.ExampleModel

我尝试了一下,因为我意识到所需的模型(来自models/目录)没有存储在任何地方,所以我在node_modules/loopback/lib/application.js:中修改了它

498 - var requiredModels = requireDir(path.join(appRootDir, 'models'));
498 + app.requiredModels = requireDir(path.join(appRootDir, 'models'));

这样,我就可以在app.js:中调用app.boot()之后访问所需的模型

app.boot(__dirname);
Object.keys(app.requiredModels).map(function(modelName) {
app.model(modelName, {dataSource: 'db'});
});

它有点工作:模型暴露于REST API,但不暴露于它的关系,有什么想法吗

此外,我修改了环回分发中的一个核心文件,所以它将在下一次更新时中断。。。

相关内容

最新更新