在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,但不暴露于它的关系,有什么想法吗
此外,我修改了环回分发中的一个核心文件,所以它将在下一次更新时中断。。。