2013-08-05 46 views
4

我創建一個表來存儲用戶會話中我將IP地址存儲爲一個整數,使用這些方法:IP-addresses stored as int results in overflow?Node.js的Sequelize的getter/setter的RangeError

我想說明一個IP領域的getter和setter,以便它可以在IP和int之間自動轉換。

不幸的是我得到以下錯誤,我不知道發生了什麼。我一直在試圖修復它幾個小時,谷歌得到我得不到任何結果:

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中無法正常工作。

回答

4

我也遇到了Sequelize這個問題。我正在閱讀並重新閱讀官方文檔,搜索我知道在互聯網上搜索的任何地方,最後我終於在這裏結束了。一旦我找到你的問題,沒有答案,我決定搜索Sequelize本身的源代碼。果然,我找到了答案!

如果您在Sequelize的源代碼查看文件sequelize/test/dao-factory.test.js,你會發現一個代碼的測試用例裏面潛伏以下位:

setterMethods: { 
    price1: function(v) { this.setDataValue('price1', v * 100) } 
}, 

我複製上面的語法,使用它在我自己的二傳手方法,它的工作原理!

他們真的應該更新續集網站上的文檔..嗯..也許我應該考慮幫助他們呢?任何方式,祝你好運!

1

我不知道是否有人仍在運行此錯誤,但如果您遇到此問題,我將如何解決此問題。

我也有類似的情況,我有它一直在尋找這樣一個的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" 
    } 
} 

我的getter和setter方法是:

{ 
    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); 
     } 
    } 
}); 

當然,我有堆棧錯誤。

爲了解決這個問題,我只是改變了我的getter和setter方法,以這樣的:

{ 
    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/getters的名稱作爲字段。

因此,簡而言之,更改爲setter和getters的名稱,以使其名稱與任何定義的字段都不匹配,從而解決了我的問題。良好的做法?我不確定,但它解決了我的問題。

1

我也有類似的情況,我以這種方式

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它不叫recoursive getterMethod該列