[英]Node.js Sequelize getter/setter RangeError
我正在創建一個表來存儲用戶會話。我將使用以下方法將IP地址存儲為整數 : 以int形式存儲的IP地址會導致溢出?
我想為IP字段指定一個getter和setter,以便它可以在IP和int之間自動轉換。
不幸的是,我收到以下錯誤,我不知道發生了什么。 我已經嘗試修復了幾個小時,而Google卻沒有結果:
RangeError: Maximum call stack size exceeded
模型:
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;
}
}
});
插入IP:
model.findOrCreate({id: sessionId}, {
id: sessionId,
ipAddress: req.ip, // === "192.168.1.79"
userAgent: req.get("user-agent"),
username: "test",
password: "test",
firstName: "first",
lastName: "last",
email: "email"
})
我可以確認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);
}
}
});
當然,我遇到了堆棧錯誤。
為了解決這個問題,我剛剛將設置器和獲取器更改為:
{
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);
}
}
});
盡管在網上有很多示例,但我發現一切都魔術般地順利進行,我看到有人建議使用與字段相同的設置器/獲取器名稱的方法。
因此,簡而言之,更改為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時,它不會為該列調用遞歸getterMethod
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.