sails.js -postgresql 为 bigint 字段返回字符串值而不是整数
sails.js -postgresql returning string value instead of integer for bigint fields
我们正在使用 Sails.js 作为后端框架将一个项目从 PHP 迁移到 Node.js。我们无法修改我们的数据库,必须为此项目使用现有数据库。
如果我为新创建的模型保留 migrate: "alter"
,默认情况下 Sails 会将 id
字段保留为整数。
然而,对于我们现有的数据库,id
字段主要是 bigint
。所以我定义了 migrate: "safe"
并继续创建模型。
现在我面临的问题是,当蓝图路由 return 结果时,应该 returned 作为数字的 id 列值正在 returned作为字符串代替。这是一个例子:
[
{
"starttime": "07:00:00",
"endtime": "14:00:00",
"id": "1"
},
{
"starttime": "14:00:00",
"endtime": "22:00:00",
"id": "2"
},
{
"starttime": "22:00:00",
"endtime": "07:00:00",
"id": "3"
}
]
我该如何解决这个问题?
这是我的模型:
module.exports = {
tableName: "timeslots",
autoCreatedAt: false,
autoUpdatedAt: false,
attributes: {
starttime: { type: "string", required: true },
endtime: { type: "string", required: true }
}
};
这是 postgresql table 定义
Table "public.timeslots"
Column | Type | Modifiers | Storage | Stats target | Description
-----------+--------+--------------------------------------------------------+----------+--------------+-------------
id | bigint | not null default nextval('timeslots_id_seq'::regclass) | plain | |
starttime | text | not null | extended | |
endtime | text | not null | extended | |
Indexes:
"idx_43504_primary" PRIMARY KEY, btree (id)
Referenced by:
TABLE "doctortimeslot" CONSTRAINT "doctortimeslot_ibfk_2" FOREIGN KEY (timeslot_id) REFERENCES timeslots(id) ON UPDATE CASCADE ON DELETE CASCADE
Waterline 对它没有内置的数据类型感到奇怪。我认为当它不确定要做什么时它默认为字符串。这并不重要,因为 JS 会在您的前端自动将这些值强制转换为数字。
但是,如果您需要它是一个数字,最简单的解决方案可能是重写模型中的 toJSON 方法并让它将该值强制为一个整数。
module.exports = {
tableName: "timeslots",
autoCreatedAt: false,
autoUpdatedAt: false,
attributes: {
starttime: { type: "string", required: true },
endtime: { type: "string", required: true },
toJSON: function(){
var obj = this.toObject();
obj.id = parseInt(obj.id);
return obj;
}
}
};
作为替代方案,您可以使用 https://github.com/mirek/node-pg-safe-numbers,它通过将不安全处理委托给您(当数字不符合 2^53 javascript 限制时)来完全解决此问题 - 您可以 return 解析值,字符串,null,抛出错误或做其他事情。
在许多情况下,您可以使用库提供的自动解析,在不安全的处理程序中只需 return 原始字符串值。然后在使用 2^53 以上数字(即随机大数字)的代码中总是转换为字符串,你会没事的。
我们正在使用 Sails.js 作为后端框架将一个项目从 PHP 迁移到 Node.js。我们无法修改我们的数据库,必须为此项目使用现有数据库。
如果我为新创建的模型保留 migrate: "alter"
,默认情况下 Sails 会将 id
字段保留为整数。
然而,对于我们现有的数据库,id
字段主要是 bigint
。所以我定义了 migrate: "safe"
并继续创建模型。
现在我面临的问题是,当蓝图路由 return 结果时,应该 returned 作为数字的 id 列值正在 returned作为字符串代替。这是一个例子:
[
{
"starttime": "07:00:00",
"endtime": "14:00:00",
"id": "1"
},
{
"starttime": "14:00:00",
"endtime": "22:00:00",
"id": "2"
},
{
"starttime": "22:00:00",
"endtime": "07:00:00",
"id": "3"
}
]
我该如何解决这个问题?
这是我的模型:
module.exports = {
tableName: "timeslots",
autoCreatedAt: false,
autoUpdatedAt: false,
attributes: {
starttime: { type: "string", required: true },
endtime: { type: "string", required: true }
}
};
这是 postgresql table 定义
Table "public.timeslots"
Column | Type | Modifiers | Storage | Stats target | Description
-----------+--------+--------------------------------------------------------+----------+--------------+-------------
id | bigint | not null default nextval('timeslots_id_seq'::regclass) | plain | |
starttime | text | not null | extended | |
endtime | text | not null | extended | |
Indexes:
"idx_43504_primary" PRIMARY KEY, btree (id)
Referenced by:
TABLE "doctortimeslot" CONSTRAINT "doctortimeslot_ibfk_2" FOREIGN KEY (timeslot_id) REFERENCES timeslots(id) ON UPDATE CASCADE ON DELETE CASCADE
Waterline 对它没有内置的数据类型感到奇怪。我认为当它不确定要做什么时它默认为字符串。这并不重要,因为 JS 会在您的前端自动将这些值强制转换为数字。
但是,如果您需要它是一个数字,最简单的解决方案可能是重写模型中的 toJSON 方法并让它将该值强制为一个整数。
module.exports = {
tableName: "timeslots",
autoCreatedAt: false,
autoUpdatedAt: false,
attributes: {
starttime: { type: "string", required: true },
endtime: { type: "string", required: true },
toJSON: function(){
var obj = this.toObject();
obj.id = parseInt(obj.id);
return obj;
}
}
};
作为替代方案,您可以使用 https://github.com/mirek/node-pg-safe-numbers,它通过将不安全处理委托给您(当数字不符合 2^53 javascript 限制时)来完全解决此问题 - 您可以 return 解析值,字符串,null,抛出错误或做其他事情。
在许多情况下,您可以使用库提供的自动解析,在不安全的处理程序中只需 return 原始字符串值。然后在使用 2^53 以上数字(即随机大数字)的代码中总是转换为字符串,你会没事的。