Loopback discoverAndBuildModels не генерируют модели

Я пытаюсь получить Loopback, чтобы открыть и построить свою первую таблицу. Я использовал простой пример на своей странице внизу:

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

и я вижу вывод таблицы, которую я обнаруживаю, но API-интерфейс API не показывает таблицу или все вновь созданные конечные точки. Кроме того, файл 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

Ответ 1

Кажется, что скрипты обнаружения только показывают результат и не создают файлы модели. Я нашел несколько инструкций в документах loopback:

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

В разделе Основная процедура второй шаг:

2. Используйте fs.writeFile(), чтобы сохранить результат в общем /models/model -name.json.

Итак, вы можете попробовать следующий подход:

  • Установите данные mysql в файле 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. Создайте папку моделей, если она не существует: yourloopbackproject/common/models.

  2. Создайте discovery-and-build.js script в папке 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);

Этот script основан на: http://www.reddit.com/r/strongloop/comments/2upy76/autodiscoveryjs_recipe/

  1. После выполнения script вы найдете файл .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

Надеюсь, это поможет!

Ответ 2

Используйте Arc для этого. Запустите дугу slc из папки проекта, и она отобразит инструмент gui, называемый arc в браузере по умолчанию. Если вы еще не зарегистрировались, зарегистрируйтесь и войдите в систему. Вы будете перенаправлены в инструмент графического интерфейса StrongLoop, Arc. Выберите свою модель из списка на левой панели. Вы сможете увидеть кнопку сохранения и миграции. Просто нажмите кнопку перехода, и ваша таблица будет создана в модели. (В миллисекундах!)

Ура!

Ответ 3

обнаружение api используется только для обнаружения схемы, чтобы не создавать модели на данный момент. пожалуйста, используйте следующий проект для создания моделей с отношением один к одному и от одного до многих и всеми моделями.

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

Ответ 4

Построение @Underskay answer, я сделал что-то вроде

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