使用带有mySql Node Express堆栈的命名约定时发生异常
我能够通过Breeze/Angular客户机成功地连接和查询mySql数据库中的数据,遵循todo Angular示例。我关掉了db表和GUI,仍然可以。当我尝试使用命名约定时,问题就开始了。(我无法控制我必须连接的数据库&我真的不想在我的客户端中使用大写字母!) 我得到以下异常:使用带有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
/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);
}