使用带有mySql Node Express堆栈的命名约定时发生异常

使用带有mySql Node Express堆栈的命名约定时发生异常,mysql,angularjs,node.js,breeze,Mysql,Angularjs,Node.js,Breeze,我能够通过Breeze/Angular客户机成功地连接和查询mySql数据库中的数据,遵循todo Angular示例。我关掉了db表和GUI,仍然可以。当我尝试使用命名约定时,问题就开始了。(我无法控制我必须连接的数据库&我真的不想在我的客户端中使用大写字母!) 我得到以下异常: /Users/Sherri/Sites/awdb-web/node_modules/breeze-sequelize/node_modules/breeze-client/breeze.debug.js:1852

我能够通过Breeze/Angular客户机成功地连接和查询mySql数据库中的数据,遵循todo Angular示例。我关掉了db表和GUI,仍然可以。当我尝试使用命名约定时,问题就开始了。(我无法控制我必须连接的数据库&我真的不想在我的客户端中使用大写字母!)

我得到以下异常:

/Users/Sherri/Sites/awdb-web/node_modules/breeze-sequelize/node_modules/breeze-client/breeze.debug.js:1852
    throw new Error("Unable to locate a registered object by the name: " + k
        ^
Error: Unable to locate a registered object by the name:     NamingConvention.underscoreCamelCase
    at Object.__config._fetchObject (/Users/Sherri/Sites/awdb-web/node_modules/breeze-sequelize/node_modules/breeze-client/breeze.debug.js:1852:13)
    at MetadataStore.proto.importMetadata (/Users/Sherri/Sites/awdb-web/node_modules/breeze-sequelize/node_modules/breeze-client/breeze.debug.js:6517:40)
    at new module.exports.MetadataMapper (/Users/Sherri/Sites/awdb-web/node_modules/breeze-sequelize/MetadataMapper.js:19:8)
    at SequelizeManager.importMetadata (/Users/Sherri/Sites/awdb-web/node_modules/breeze-sequelize/SequelizeManager.js:46:24)
    at createSequelizeManager (/Users/Sherri/Sites/awdb-web/server/routes.js:114:8)
    at /Users/Sherri/Sites/awdb-web/server/routes.js:23:27
当我从metadata.json文件中取出
“namingConvention”:“camelCase”
行时,错误消失了,但当然,数据库属性无法正确转换

下面是我用来设置实体管理器的相关代码:(编辑:我很确定我的问题是服务器端的,与此代码无关)

下面是我的metadata.json文件的一个片段:

{
  "metadataVersion": "1.0.5",
  "namingConvention": "underscoreCamelCase",
  "localQueryComparisonOptions": "caseInsensitiveSQL",
  "dataServices": [
    {
      "serviceName": "breeze/awdb/",
      "hasServerMetadata": true,
      "jsonResultsAdapter": "webApi_default",
      "useJsonp": false
    }
  ],
  "structuralTypes": [
    {
      "shortName": "person",
      "namespace": "AWdb.Models",
      "autoGeneratedKeyType": "Identity",
      "defaultResourceName": "people",
      "dataProperties": [
        {
          "name": "Person_ID",
          "dataType": "Int32",
          "isNullable": false,
          "defaultValue": 0,
          "isPartOfKey": true,
          "validators": [
            {
              "name": "required"
            },
            {
              "min": -2147483648,
              "max": 2147483647,
              "name": "int32"
            }
          ]
        },
        {
          "name": "Household_ID",
          "dataType": "Int32",
          "validators": [
            {
              "min": -2147483648,
              "max": 2147483647,
              "name": "int32"
            }
          ]
        },
....
      ]
    }
  ],
  "resourceEntityTypeMap": {"people": "person:#AWdb.Models"}
}
编辑: 下面是我的routes.js文件中获取元数据的代码

  var fs = require('fs');
  var breezeSequelize = require('breeze-sequelize');

  var SequelizeManager = breezeSequelize.SequelizeManager;
  var SequelizeQuery = breezeSequelize.SequelizeQuery;
  var SequelizeSaveHandler = breezeSequelize.SequelizeSaveHandler;

  var breeze = breezeSequelize.breeze;
  var EntityQuery = breeze.EntityQuery;

  var dbConfig = {
    host: 'localhost',
    user: 'xx',
    password: 'xx',
    dbName: 'xx'
  };

  var _sequelizeManager = createSequelizeManager();

  // _sequelizeManager.sync(true).then(seed).then(function(){
  //     console.log('db init successful');
  // });

  exports.init = init;

  function init(app) {
    app.get('/breeze/awdb/Metadata', function (req, res, next) {
      try {
        var metadata = readMetadata();
        res.send(metadata);
      } catch(e){
        next(e);
      }
    });

  function createSequelizeManager() {
    var metadata = readMetadata();
    var sm = new SequelizeManager(dbConfig);
    sm.importMetadata(metadata);

    return sm;
  }

  function readMetadata() {
    var filename = "server/AWdbMetadata.json";
    if (!fs.existsSync(filename)) {
      filename = "AWdbMetadata.json";

      if (!fs.existsSync(filename)) {
        throw new Error("Unable to locate file: " + filename);
      }
    }
    var metadata = fs.readFileSync(filename, 'utf8');
    return JSON.parse(metadata);
  }

有什么想法吗?当我在node.js服务器上,使用metadata.json文件而不是.net entity framework时,我是否能够使用自定义命名约定?

如果我看得对,那么我认为您的问题是服务器上的元数据。如果我理解正确,您的表名和列名遵循大写字母加下划线的单词模式。服务器上的Breeze/Sequelize堆栈目前无法转换名称,因此必须使用与DB模式中相同的实体和属性名称。否则,继续翻译的微风就会失败。您仍然可以在客户端上使用命名约定,将带下划线的服务器名称转换为您希望它们在客户端上的任何名称


因此,您需要两个元数据文件。一个用于Breeze/Sequelize堆栈使用的服务器,该服务器使用与数据库中完全相同的名称,然后为客户端提供一个单独的元数据文件,您可以在其中进行翻译。

我不确定为什么代码不起作用,但您可以尝试添加
Breeze.NamingConvention.下划线cmelcase=NamingConvention感谢您尝试史蒂夫,但不幸的是,它没有帮助。不过,它确实帮助我认识到,问题完全在服务器端,与我如何在客户机上设置它无关。意识到这一点后,我在我的问题中添加了一个服务器代码片段。我有一种感觉是这样的,但感谢您在@superswiss中确认这一点。
  var fs = require('fs');
  var breezeSequelize = require('breeze-sequelize');

  var SequelizeManager = breezeSequelize.SequelizeManager;
  var SequelizeQuery = breezeSequelize.SequelizeQuery;
  var SequelizeSaveHandler = breezeSequelize.SequelizeSaveHandler;

  var breeze = breezeSequelize.breeze;
  var EntityQuery = breeze.EntityQuery;

  var dbConfig = {
    host: 'localhost',
    user: 'xx',
    password: 'xx',
    dbName: 'xx'
  };

  var _sequelizeManager = createSequelizeManager();

  // _sequelizeManager.sync(true).then(seed).then(function(){
  //     console.log('db init successful');
  // });

  exports.init = init;

  function init(app) {
    app.get('/breeze/awdb/Metadata', function (req, res, next) {
      try {
        var metadata = readMetadata();
        res.send(metadata);
      } catch(e){
        next(e);
      }
    });

  function createSequelizeManager() {
    var metadata = readMetadata();
    var sm = new SequelizeManager(dbConfig);
    sm.importMetadata(metadata);

    return sm;
  }

  function readMetadata() {
    var filename = "server/AWdbMetadata.json";
    if (!fs.existsSync(filename)) {
      filename = "AWdbMetadata.json";

      if (!fs.existsSync(filename)) {
        throw new Error("Unable to locate file: " + filename);
      }
    }
    var metadata = fs.readFileSync(filename, 'utf8');
    return JSON.parse(metadata);
  }