微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 我们总是可以使用knex和postgres将日期列提取为字符串(varchar)吗?

我在postgres数据库中有一个类型为date的列.这是一个像生日这样的列,它只是一个日期,不需要有时间部分.

使用knex获取此列时,结果是一个javascript Date对象.它可能是新的Date(row.birthday),这是发送给客户端的结果.

现在的问题是客户端接收的值是带有时间部分和Z的标准ISO 8601格式.当客户端尝试从此字符串创建新的Date对象时,客户端可能具有基于的错误日期值客户所在的位置.

例如:

Date: 2018-06-15
Date sent to client: 2018-06-15T00:00:00Z

Client in +5:00     | Client in -5:00
2018-06-16 05:00:00 | 2018-05-15 10:00:00

如果服务器是UTC,这很好,我们可以添加客户端的时区偏移并获取原始日期,但这感觉有点脆弱,并且在本地开发期间(不是UTC)中断.

一个简单的解决方案是将日期部分作为字符串发送给客户端.但这需要将日期作为varchar存储在服务器中,我们不想这样做.我们将丢失日期格式约束,并且将使用sql进行基于日期的计算变得更加困难.

我们可以在选择列时将列强制转换为varchar,但是每次获取此表时我们都需要考虑这一点.这也意味着我们需要绕过ORM(Bookshelf)来处理这个表.

有没有一种简单的方法可以指定在knex或书架或postgres本身中,列需要存储为日期,包含所有附带的约束,但总是被提取为varchar?

解决方法:

node-postgres驱动程序是从日期列(https://node-postgres.com/features/types#date-timestamp-timestamptz)发送的数据实际创建Date()对象的部分

使用postgres,您可以修改node-pg的类型解析器,如此处所述

可以使用以下查询获取日期类型类型的oid,即1082

select typname, oid, typarray from pg_type where typname = 'date' order by oid;

因此要覆盖要作为字符串传递的日期类型,在设置数据库连接之前就足以执行此操作(我想可以在knexfile.js中执行此操作):

var types = require('pg').types;
// override parsing date column to Date()
types.setTypeParser(1082, val => val); 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐