Loopback discoverAndBuildModels no genera modelos

Estoy tratando de que Loopback descubra y construya mi primera mesa. He usado el ejemplo simple en su página en la parte inferior aquí:

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

y veo el resultado de la tabla que estoy descubriendo, pero el API Explorer no muestra la tabla ni los puntos finales recién generados. Además, el archivo model-config.js no se actualiza con el nuevo objeto de tabla. Aquí está la sección básica del código hecho en el inicio del servidor:

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); 

Para resumir, esto se ejecuta, no hay errores. Pero no hay nuevos modelos en http://localhost:3000/explorer

Parece que los scripts de descubrimiento solo muestran la salida y no crean los archivos de modelo. He encontrado algunas instrucciones en documentos de bucle invertido:

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

En la sección Procedimiento Básico , el segundo paso:

2. Utilice fs.writeFile () para guardar la salida en common / models / model-name.json.

Así que puedes probar el siguiente enfoque:

  1. Configure sus datos mysql en el archivo yourloopbackproject / server / datasources.json :
 { "db": { "name": "db", "connector": "memory" }, "accountDs": { "host": "mysqlServerName", "port": 3306, "database": "databaseName", "username": "username", "password": "password!", "name": "accountDs", "connector": "mysql" } } 
  1. Cree la carpeta de modelos si no existe: yourloopbackproject / common / models .

  2. Cree el script discovery-and-build.js en la carpeta yourloopbackproject / server / bin :

 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); 

Este script se basa en: http://www.reddit.com/r/strongloop/comments/2upy76/autodiscoveryjs_recipe/

  1. Después de la ejecución del script, encontrará un archivo .json en la carpeta de modelos. Vaya al paso 3 en la sección Procedimiento básico : http://docs.strongloop.com/display/public/LB/Discovering+models+from+relational+databases

  2. Siga estos pasos para exponer su modelo a través de REST: http://docs.strongloop.com/display/public/LB/Exposing+models+over+REST

¡Espero que esto ayude!

Usa Arco para esto. Ejecute slc arc desde la carpeta del proyecto y se mostrará la herramienta de interfaz gráfica de usuario llamada arco en el navegador predeterminado. Si aún no se ha registrado, regístrese e inicie sesión. Se le dirigirá a la herramienta GUI de StrongLoop, el Arc. Seleccione su modelo de la lista en el panel izquierdo. Podrás ver el botón guardar y migrar. Simplemente haga clic en el botón migrar y su tabla se creará en el modelo (¡dentro de milisegundos!)

¡Aclamaciones!

la API de descubrimiento se usa para descubrir solo el esquema, no para crear modelos por ahora. Utilice el siguiente proyecto para crear modelos con una a una y una con muchas relaciones y todos los modelos.

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

Aprovechando la respuesta de @ Underskay , hice algo como

 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));