使用命名约定的W / Breeze Angular mySql Node Express堆栈的exception

我可以通过Breeze / Angular客户端成功地连接和查询来自mySql数据库的数据,遵循todo-angular示例。 我关掉了数据库表和graphics用户界面,仍然没问题。 当我尝试使用命名约定时,问题就开始了。 (我没有控制数据库,我必须连接到&我真的不想在我的客户端使用Uppercase_Underscored_Words!)

我收到以下exception:

/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"行时,错误消失了,但是当然数据库属性无法正确转换。

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

 var namingConvention = new UnderscoreCamelCaseConvention(); namingConvention.setAsDefault(); breeze.core.config.initializeAdapterInstance("uriBuilder", "json"); var serviceName = 'breeze/awdb'; var manager = new breeze.EntityManager(serviceName); // Take any server property name and make it camelCase for the client to use. // also, save it so that we can convert from the client back to the server's name function UnderscoreCamelCaseConvention() { var serverNames = { netPoints: 'netPoints', netPointsSpent: 'netPointsSpent' }; // every translated server name return new breeze.NamingConvention({ name: 'underscoreCamelCase', clientPropertyNameToServer: clientPropertyNameToServer, serverPropertyNameToClient: serverPropertyNameToClient }); function clientPropertyNameToServer(clientPropertyName) { return serverNames[clientPropertyName]; } function serverPropertyNameToClient(serverPropertyName) { var clientName = _.camelCase(serverPropertyName); serverNames[clientName] = serverPropertyName; return clientName; } } 

这里是我的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文件而不是.netentity framework?

如果我正确地看这个,那么我认为你的问题是服务器上的元数据。 如果我理解正确,您的表和列名称将遵循Uppercase_Underscored_Word模式。 服务器上的Breeze / Sequelize堆栈目前无法转换名称,因此必须完全按照DB架构中的名称使用实体和属性。 否则,微风翻译会失败。 您仍然可以在客户端上使用命名约定将下划线的服务器名称转换为您希望它们在客户端上的任何名称。

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