Sequelize is returning integer as string

青春壹個敷衍的年華 提交于 2019-12-08 17:36:18

问题


I using nodejs v4 with sequelize, and I have a model like this:

var Device = sequelize.define('Device', {
id: {
  type: DataTypes.BIGINT,
  primaryKey: true,
  autoIncrement: true
},
tenantId: {
  type: DataTypes.BIGINT,
  allowNull: false
},
token: {
  type: DataTypes.STRING,
  allowNull: false
}
}, {
 tableName: 'devices'
});

When I select a device by id the type of id is a string, exemple:

Device.findById(9).then( function(result) {
  console.log(result.toJSON().id + 10);
});

The output will be 910, rather than 19, so I look at json and a saw this:

{
  id: "9"
  tenantId: "123"
  token: "adsadsdsa"
}

The id in found device is a string, but I defined it as a number...

Doesn't it should be { "id": 9 } ?

How can I select a device with the types that I defined previously?


回答1:


BIGINT maximum value is 2^63-1, javascript can safely represent up to 2^53. To be on the safe side libraries return those numbers as strings.

If you want to have numbers instead of strings, you can use this library https://github.com/mirek/node-pg-safe-numbers which deals with this issue.




回答2:


I found a fix to this problem on sequelize repo.

https://github.com/sequelize/sequelize/issues/4523

The pg module used for sequelize returns bigint as string because bigints are not guaranteed to fit into js numbers. So I change my model to use integer (DataTypes.INTEGER)




回答3:


IMO, a smoother solution is to force parsing of int to int, instead of strings. Checkout this issue and comments.




回答4:


By default, sequelize try format your results. You can set raw :true for get raw data



来源:https://stackoverflow.com/questions/32544151/sequelize-is-returning-integer-as-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!