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(),但我不知道如何在需要的模型访问appjs文件。

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

+0

我也可以设置一个'grunt'任务到不同的文件在另一个目录不是'型号/'结合起来,打造'models.json',但如果环回扫描该目录,我想这可以使用,我很高兴知道最佳做法是什么。 – Pandaiolo

+1

我已经为app.boot()填充了一个GitHub问题来支持多个json文件 - https://github.com/strongloop/loopback/issues/17 –

我也想过用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 
+0

完美地工作,谢谢。但是,我使用小写字母作为模型的名称,因为它用作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,而不是它的关系,任何想法为什么?

而且,我修改从环路分布的核心文件,所以它将会在未来的更新打破...