Node.js 使用Waterlinejs在PostgreSQL中插入带微秒的时间戳

Node.js 使用Waterlinejs在PostgreSQL中插入带微秒的时间戳,node.js,postgresql,timestamp,waterline,sails-postgresql,Node.js,Postgresql,Timestamp,Waterline,Sails Postgresql,我试图以微秒的精度保存一个timestamptz,如下所示: 2016-10-18T13:36:38.431555 我单独测试了PostgreSQL,它运行良好: CREATE TABLE test(mytime timestamptz); INSERT INTO test('2016-10-18T13:36:38.431555'); SELECT * FROM test; 选择返回正确的精度: 2016-10-18T13:36:38.431555 然后,我使用相同的sql查询对nodej

我试图以微秒的精度保存一个timestamptz,如下所示:

2016-10-18T13:36:38.431555
我单独测试了PostgreSQL,它运行良好:

CREATE TABLE test(mytime timestamptz);
INSERT INTO test('2016-10-18T13:36:38.431555');
SELECT * FROM test;
选择返回正确的精度:

2016-10-18T13:36:38.431555
然后,我使用相同的sql查询对nodejs和pg连接器进行了测试

以字符串形式传递时间戳是可行的,但是如果我想传递日期对象,那么我就失去了微秒精度。这是一个JavaScript限制,因为日期对象的最大分辨率为毫秒。要绕过此问题,我使用此函数将时间戳转换为bigint:

function convertToUnixTS(timestamp) {
    return new Date(timestamp).getTime() * 1000 + parseInt(timestamp.substr(timestamp.length - 3));
}
bigint对postgres是透明的,select查询返回正确的时间戳

2016-10-18T13:36:38.431555
现在转到Waterline,我用postgres适配器创建了一个集合,并将时间戳定义为datetime

Persistence.prototype.collections.Value = Waterline.Collection.extend({
    identity: 'value',
    connection: 'default',
    attributes: {
        mytimestamptz: {
            type: 'datetime',
            required: true
        },
        myvalue: {
            type: 'float',
            required: true
        }
    }
});

这将节省我的时间戳,分辨率为秒,水线github上可能有支持毫秒的补丁(我已经测试过了,它正在工作),但我仍然缺少微秒精度的3个额外数字。正如我所演示的,JavaScript中处理此问题的唯一方法是将其转换为bigint。将bigint传递给当前模型会引发异常,因此我尝试像这样更改模型

mytimestamptz: {
    type: 'integer',
    size: 64,
    required: true
}

但是现在waterline框架抛出了一个无效的属性错误

(node:12964) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 4): [Error (E_VALIDATION) 1 attribute is invalid] Invalid attributes sent to event:
 • di_timestamptz
   • [object Object]
而作为字符串,我看到:

1477488110007650
另外,我真的更愿意把它作为一个例子

可能吗


谢谢

“向我当前的模型传递一个bigint将引发一个异常”你能发布异常吗?用异常来更新问题,也可以查看这个问题的答案。
1477488110007650