Sequelize返回整数作为字符串

时间:2015-09-12 21:56:23

标签: node.js sequelize.js

我使用带有sequelize的nodejs v4,我有一个这样的模型:

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

当我按id选择设备时,id的类型是一个字符串,例如:

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

输出将是910,而不是19,所以我看看json,看到了这个:

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

找到的设备中的id是一个字符串,但我将其定义为数字...

它不应该是{“id”:9}?

如何选择具有我之前定义的类型的设备?

5 个答案:

答案 0 :(得分:4)

BIGINT最大值是2 ^ 63-1,javascript可以安全地代表最多2 ^ 53。为了安全起见,库将这些数字作为字符串返回。

如果您想使用数字而不是字符串,可以使用此库https://github.com/mirek/node-pg-safe-numbers处理此问题。

答案 1 :(得分:2)

我在sequelize repo上找到了解决这个问题的方法。

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

用于sequelize的pg模块将bigint作为字符串返回,因为bigint不能保证适合js数字。所以我改变我的模型使用整数(DataTypes.INTEGER)

答案 2 :(得分:1)

IMO,一个更平滑的解决方案是强制将int解析为int,而不是字符串。结帐this issue and comments

答案 3 :(得分:0)

试图将这一行放在您的逻辑代码对我有用之前,这会强制将 int8 解析为 int,而不是字符串:

// TemplateCard.js
...

const TemplateCard = ({
    title,
    description,
    img,
    classNameToAdd,
    classNameOnSelected,
    /* selected,  we will make this a state instead of prop */
}: Props) => {
    const { aspectRatio, vmin } = useWindowResponsiveValues();

    const [selected, setSelected] = useState(false); // Added state

    // Added handler
    const handleClick = () => {
      setSelected(!selected);
    };

    if (selected) {
        className += `${styles.card} ${classNameToAdd} ${classNameOnSelected}`;
    }

    return (
        <div style={card} className={className} onClick={handleClick}>
            <img style={imageSize} src={img}></img>
            <div style={cardTitle}>{title}</div>
            <div style={descriptionCard}>{description}</div>
        </div>
    );
};
...

答案 4 :(得分:-1)

默认情况下,sequelize尝试格式化您的结果。您可以为获取原始数据设置raw :true