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);
标签:knex-js,bookshelf-js,javascript,postgresql,pg 来源: https://codeday.me/bug/20190910/1799147.html