【问题标题】:Loopback discoverAndBuildModels not generating modelsLoopback discoverAndBuildModels 不生成模型
【发布时间】:2014-11-25 12:31:01
【问题描述】:

我正在尝试让 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上没有显示新模型

【问题讨论】:

  • 谢谢,我只是为了显示目的而将名称替换为我的实际数据源。它使用了正确的驱动程序类型,只是我的命名不好。
  • 我也观察到了同样的事情,但原因是我使用模型的基类作为'Model'而不是'PersistedModel'
  • 我也有同样的问题。我在 server/boot/discover.js 中发现并得到相同的结果。

标签: node.js loopbackjs strongloop


【解决方案1】:

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

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. 如果模型文件夹不存在,则创建:yourloopbackproject/common/models

  2. yourloopbackproject/server/bin 文件夹中创建 discovery-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. 脚本执行后,您会在模型文件夹中找到一个 .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

我希望这会有所帮助!

【讨论】:

  • 这条线好像不行。 var app = require(path.resolve(__dirname, '../server'));
  • 嗯,这很奇怪。执行时有任何错误信息吗?我正在测试代码并且执行此行没有问题。该脚本必须位于“yourloopbackproject/server/bin”上的 bin 文件夹中。顺便说一句,@Anoop.P.A 评论说您可以使用 arc 来发现模型。 :)
  • 并通过associations : true 包含表关系
  • 你的意思是关系:真的
【解决方案2】:

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

干杯!

【讨论】:

  • 虽然这比编写脚本要容易得多,但它没有任何选项来包含表之间的关系。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2019-12-29
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 2018-05-22
      • 2018-03-30
      相关资源
      最近更新 更多