Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js Sequelize getter/setter Range错误_Javascript_Node.js_Express_Sequelize.js - Fatal编程技术网

Javascript Node.js Sequelize getter/setter Range错误

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},

我正在创建一个表来存储用户会话。我将使用以下方法将IP地址存储为整数:

我想为IP字段指定一个getter和setter,以便它可以在IP和int之间自动转换

不幸的是,我得到以下错误,我不知道发生了什么。我花了几个小时试图修复它,但谷歌没有给我任何结果:

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;