簡體   English   中英

Node.js序列化getter / setter RangeError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM