Loopback discoverAndBuildModels不生成模型

时间:2014-09-30 19:09:03

标签: node.js loopbackjs strongloop

我正在尝试让Loopback发现并构建我的第一个表。我在底部的页面上使用了这个简单的例子:

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

上没有新模型显示

4 个答案:

答案 0 :(得分:10)

似乎发现脚本仅显示输出而不创建模型文件。我在loopback docs上找到了一些说明:

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数据:
  2. {
      "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. yourloopbackproject / server / bin 文件夹中创建 discovery-and-build.js 脚本:

    3. 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. 脚本执行后,您将在models文件夹中找到.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

      3. 我希望这有帮助!

答案 1 :(得分:2)

使用Arc进行此操作。 从项目文件夹运行slc arc,它将在默认浏览器中显示名为arc的gui工具。如果您尚未注册,请注册并登录。您将被引导至StrongLoop的GUI工具,即Arc。从左侧窗格的列表中选择您的模型。您将能够看到保存和迁移按钮。只需单击“迁移”按钮,您的表就会被创建到模型中。(在毫秒内!)

干杯!

答案 2 :(得分:1)

discovery api用于仅发现现在不创建模型的模式。 请使用以下项目创建具有一对一和一对多关系以及所有模型的模型。

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

答案 3 :(得分:0)

建立@Underskay's 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));