2

在 Loopback 文档Initializing the application中,说了两件事:

第一的 :

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

然后 :

“不要在多个文件中组合使用 app.boot() 和 app.model(name, config),因为这可能会导致模型由于竞争条件而未定义。为避免在使用 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
}

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

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

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

4

2 回答 2

9

我也想过用app.model()代替Model.extend(),但是不知道如何在需要的model js文件中访问app。

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

所以你可以通过这种方式获取 app 对象:

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

拥有 app 对象后,您可以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
于 2014-02-11T19:17:14.647 回答
0

我尝试了一下,意识到所需的模型(来自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()调用后访问所需的模型app.js

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

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

另外,我从环回分发中修改了一个核心文件,所以它会在下次更新时中断......

于 2014-02-11T17:28:46.083 回答