Loopback discoverAndBuildModels不生成模型

我试图让Loopback发现并build立我的第一张桌子。 我在他们的页面底部使用了这个简单的例子:

http://docs.strongloop.com/display/LB/Database+discovery+API#DatabasediscoveryAPI-Exampleofbuildingmodelsviadiscovery

我看到我正在发现的表的输出,但API Explorer不显示表或任何新生成的端点。 此外,model-config.js文件不会使用新的表格对象进行更新。 以下是在服务器启动时完成的代码的基本部分:

var loopback = require('loopback'); var boot = require('loopback-boot'); var DataSource = require('loopback-datasource-juggler').DataSource; var mysqlSource = require('./datasources.json'); var dataSource = new DataSource('mssql', mysqlSource.mysqlserver); var app = module.exports = loopback(); // Set up the /favicon.ico app.use(loopback.favicon()); // request pre-processing middleware app.use(loopback.compress()); // -- Add your pre-processing middleware here -- dataSource.discoverAndBuildModels('CATS', {owner: 'mamacat'}, function (err, models) { models.Cat.find(function (err, cat) { if (err) { console.error(err); } else { console.log(cat); } dataSource.disconnect(); }); }); // boot scripts mount components like REST API boot(app, __dirname); 

总而言之,这个运行,没有错误。 但是没有新的模型在http://localhost:3000/explorer

似乎发现脚本只显示输出,并不创build模型文件。 我在loopback文档中find了一些说明:

http://docs.strongloop.com/display/public/LB/Discovering+models+from+relational+databases

在“ 基本程序”一节中,第二步:

2.使用fs.writeFile()将输出保存在common / models / model-name.json中。

所以你可以尝试下面的方法:

  1. yourloopbackproject / server / datasources.json文件中设置你的mysql数据:
 { "db": { "name": "db", "connector": "memory" }, "accountDs": { "host": "mysqlServerName", "port": 3306, "database": "databaseName", "username": "username", "password": "password!", "name": "accountDs", "connector": "mysql" } } 
  1. 创build模型文件夹如果不存在: yourloopbackproject / common / models

  2. 在您的loopbackproject / server / bin文件夹上创builddiscovery-and-build.js脚本:

 var path = require('path'); var fs = require('fs'); var app = require(path.resolve(__dirname, '../server')); var outputPath = path.resolve(__dirname, '../../common/models'); var dataSource = app.dataSources.accountDs; function schemaCB(err, schema) { if(schema) { console.log("Auto discovery success: " + schema.name); var outputName = outputPath + '/' +schema.name + '.json'; fs.writeFile(outputName, JSON.stringify(schema, null, 2), function(err) { if(err) { console.log(err); } else { console.log("JSON saved to " + outputName); } }); } if(err) { console.error(err); return; } return; }; dataSource.discoverSchema('tableName',{schema:'schemaName'},schemaCB); 

此脚本基于: http : //www.reddit.com/r/strongloop/comments/2upy76/autodiscoveryjs_recipe/

  1. 脚本执行后,您将在模型文件夹中find.json文件。 转到基本程序部分的第3步: http : //docs.strongloop.com/display/public/LB/Discovering+models+from+relational+databases

  2. 请按照以下步骤通过REST公开您的模型: http : //docs.strongloop.com/display/public/LB/Exposing+models+over+REST

我希望这有帮助!

为此使用弧。 从项目文件夹运行slc弧,它会在默认浏览器中显示称为arc的gui工具。 如果您还没有注册,请注册并login。您将被引导至StrongLoop的Arc工具。 从左侧窗格的列表中select您的模型。 您将能够看到保存并迁移button。 只需点击migratebutton,你的表格就会被创build成模型(毫秒内!)

干杯!

发现api用于发现模式现在不创build模型。 请使用以下项目创build一对一,一对多关系和所有模型的模型。

https://github.com/savsharma2/loopback-sql-create-model-with-relation/

基于@ Underskay的回答 ,我做了类似的事情

 var fs = require('fs'); var app = require(__dirname + '/server/server'); function makePromise(f, parent) { return function(...args) { return new Promise((resolve, reject) => { f.call(parent, ...args, (err, ...data) => { if (err) return reject(err); resolve(data.length === 1 ? data[0] : data); }); }); }; } var readFile = makePromise(fs.readFile, fs); var writeFile = makePromise(fs.writeFile, fs); function writeSchemas(schemas) { return Promise.all(schemas.map(data => { var schema = data[Object.keys(data)[0]]; return writeFile('common/models/' + schema.name + '.json', JSON.stringify(schema, null, '\t')); })) .then(() => readFile('server/model-config.json')) .then(JSON.parse) .then(conf => { for (let schema of schemas) conf[schema[Object.keys(schema)[0]].name] = { "dataSource": "mysql" }; return conf; }) .then(conf => writeFile('server/model-config.json', JSON.stringify(conf, null, '\t'))); } function getSchemas(ds) { var discoverSchemas = makePromise(ds.discoverSchemas, ds); return makePromise(ds.discoverModelDefinitions, ds)({}) .then(tables => Promise.all(tables.map(t => discoverSchemas(t.name, { relations: true })))) .then(data => { ds.disconnect(); return data; }); } Promise.resolve(app.datasources.mysql) .then(ds => getSchemas(ds)) .then(schemas => writeSchemas(schemas)) .catch(err => log.error(err));