Javascript Node.js Sequelize getter/setter Range错误
我正在创建一个表来存储用户会话。我将使用以下方法将IP地址存储为整数: 我想为IP字段指定一个getter和setter,以便它可以在IP和int之间自动转换 不幸的是,我得到以下错误,我不知道发生了什么。我花了几个小时试图修复它,但谷歌没有给我任何结果:Javascript Node.js Sequelize getter/setter Range错误,javascript,node.js,express,sequelize.js,Javascript,Node.js,Express,Sequelize.js,我正在创建一个表来存储用户会话。我将使用以下方法将IP地址存储为整数: 我想为IP字段指定一个getter和setter,以便它可以在IP和int之间自动转换 不幸的是,我得到以下错误,我不知道发生了什么。我花了几个小时试图修复它,但谷歌没有给我任何结果: RangeError:超过最大调用堆栈大小 型号: model = db.define(name, { id: {type: Sequelize.STRING, allowNull: false, primaryKey: true},
RangeError:超过最大调用堆栈大小
型号:
model = db.define(name, {
id: {type: Sequelize.STRING, allowNull: false, primaryKey: true},
ipAddress: {type: Sequelize.INTEGER(11).UNSIGNED, allowNull: false},
userAgent: {type: Sequelize.STRING, allowNull: false},
username: {type: Sequelize.STRING, allowNull: false},
password: {type: Sequelize.STRING, allowNull: false},
firstName: {type: Sequelize.STRING, allowNull: false},
lastName: {type: Sequelize.STRING, allowNull: false},
email: {type: Sequelize.STRING}
}, {
getterMethods: {
name: function() { return this.firstName + this.lastName },
ipAddress: function() {
ip = this.getDataValue("ipAddress");
return ((ip >> 24) & 255) + "." + ((ip >> 16) & 255) + "." + ((ip >> 8) & 255) + "." + (ip & 255);
}
},
setterMethods: {
ipAddress: function(ip) {
var parts = ip.split(".");
var ret = 0;
ret += parseInt(parts[0], 10) << 24;
ret += parseInt(parts[1], 10) << 16;
ret += parseInt(parts[2], 10) << 8;
ret += parseInt(parts[3], 10);
return ret;
}
}
});
我可以确认getter/setter代码确实按照需要进行了转换,但是它在Sequelize中没有正常工作。我在Sequelize中也遇到了这个问题。我一遍又一遍地阅读官方文件,在我知道的任何地方搜索,然后在互联网上搜索,最后我来到了这里。一旦我发现你的问题,没有答案,我决定搜索Sequelize本身的源代码。果然,我找到了答案 如果查看sequelize源代码中的文件
sequelize/test/dao factory.test.js
,您会发现测试用例中隐藏着以下代码:
setterMethods: {
price1: function(v) { this.setDataValue('price1', v * 100) }
},
我复制了上面的语法,在我自己的setter方法中使用了它,它很有效
他们真的应该更新sequelize网站上的文档。。隐马尔可夫模型。。也许我应该考虑帮他们解决这个问题?无论如何,祝你好运 我不知道是否有人仍在运行此错误,但如果您在这方面遇到问题,以下是我解决此问题的方法 我有一个类似的情况,我有一个UserModel对象,看起来像这样:
var UserModel = sequelize.define("users", {
ID: {
type: Sequelize.INTEGER,
field: "ID",
primaryKey: true,
autoIncrement: true
},
Username: {
type: Sequelize.STRING,
field: "Username"
},
Password: {
type: Sequelize.STRING,
field: "Password"
},
Sector: {
type: Sequelize.INTEGER,
field: "Sector"
},
SubSector: {
type: Sequelize.INTEGER,
field: "SubSector"
},
Email: {
type: Sequelize.STRING,
field: "email"
},
Status: {
type: Sequelize.INTEGER,
field: "status"
}
}
我的二传手和传接手是:
{
getterMethods: {
Sector: function() {
return this.Sector;
},
Status: function() {
return this.Status;
}
},
setterMethods: {
Sector: function(val) {
this.setDataValue('Sector',val);
},
Status: function(val) {
this.setDataValue('Status',val);
}
}
});
当然,我有堆栈错误
为了解决这个问题,我刚刚将setter和getter改为:
{
getterMethods: {
currSector: function() {
return this.Sector;
},
currStatus: function() {
return this.Status;
}
},
setterMethods: {
newSector: function(val) {
this.setDataValue('Sector',val);
},
newStatus: function(val) {
this.setDataValue('Status',val);
}
}
});
尽管在网上的许多例子中,我看到有人建议使用与字段相同的setters/getter名称,但一切都进行得非常顺利
所以,简而言之,更改为setter和getter名称,使它们的名称与任何已定义的字段都不匹配,从而解决了我的问题。良好做法?我不确定,但它解决了我的问题。我也遇到过类似的情况,我就是这样解决的
const ProductImages = db.define('product_images', {
product_image_id: {type: Sequelize.INTEGER, primaryKey: true,
autoIncrement: true},
url: Sequelize.TEXT,
product_id: Sequelize.INTEGER,
is_primary: Sequelize.INTEGER,
}, {
timestamps: false,
getterMethods: {
is_primary() {
return parseInt(this.dataValues.is_primary)
},
},
scopes: {
byDefault() {
return {
include: [{
model: ProductDescriptions, as:
'product_description', where: {language_id: 1}
}]
};
},
}
})
module.exports = ProductImages;
当我调用this.davaValues.column_name时,它不调用该列的Recoversive getterMethod
const ProductImages = db.define('product_images', {
product_image_id: {type: Sequelize.INTEGER, primaryKey: true,
autoIncrement: true},
url: Sequelize.TEXT,
product_id: Sequelize.INTEGER,
is_primary: Sequelize.INTEGER,
}, {
timestamps: false,
getterMethods: {
is_primary() {
return parseInt(this.dataValues.is_primary)
},
},
scopes: {
byDefault() {
return {
include: [{
model: ProductDescriptions, as:
'product_description', where: {language_id: 1}
}]
};
},
}
})
module.exports = ProductImages;