StrongLoop:如何在loopback.boot()时间的models /目录中定义模型?
在环回文档Initializing the application,这是说两件事情:StrongLoop:如何在loopback.boot()时间的models /目录中定义模型?
第一:
Loopback.boot()基于JSON定义文件, 或给定的选项加载数据源和模型,然后,加载所有JS从模型/和启动/目录文件
然后:
“请勿混用多种使用app.boot()和app.model(名称,配置) 文件,因为它可能会导致模型由于被未定义竞赛条件。 要使用app.boot()确保所有型号都为模型定义的一部分 过去了避免这种情况。”
不两个似乎矛盾吗?
我有很多车型定义,我不希望在一个巨大的json
文件来定义,因此希望把每一个模型文件js
在说models/
目录在系统启动时加载。
我做了什么,为那一刻,就是定义一个模型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
}
它不工作,回送抛出一个异常Class not found
。
我也想过用app.model()
代替Model.extend()
,但我不知道如何在需要的模型访问app
js
文件。
问题:如何在models/
目录中定义模型,并仍然依靠所有boot()
机制将它们附加到应用程序,数据源和REST API上?
我也想过用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
完美地工作,谢谢。但是,我使用小写字母作为模型的名称,因为它用作API端点。 – Pandaiolo
我给它一个尝试,通过实现所需的模型(从models/
目录)不存储任何地方,所以我修改了这一点,在node_modules/loopback/lib/application.js
:
498 - var requiredModels = requireDir(path.join(appRootDir, 'models'));
498 + app.requiredModels = requireDir(path.join(appRootDir, 'models'));
这样的话,我可以访问所需
app.boot(__dirname);
Object.keys(app.requiredModels).map(function(modelName) {
app.model(modelName, {dataSource: 'db'});
});
它还挺工作:在app.boot()
呼叫app.js
后模型模型暴露在REST API,而不是它的关系,任何想法为什么?
而且,我修改从环路分布的核心文件,所以它将会在未来的更新打破...
我也可以设置一个'grunt'任务到不同的文件在另一个目录不是'型号/'结合起来,打造'models.json',但如果环回扫描该目录,我想这可以使用,我很高兴知道最佳做法是什么。 – Pandaiolo
我已经为app.boot()填充了一个GitHub问题来支持多个json文件 - https://github.com/strongloop/loopback/issues/17 –