#node.js #postgresql #timestamp #waterline #sails-postgresql
#node.js #postgresql #временная метка #ватерлиния #паруса-postgresql
Вопрос:
Я пытаюсь сохранить временную метку с точностью до микросекунд, подобной этой:
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
Затем я протестировал с помощью nodejs и соединителя pg, используя те же SQL-запросы.
Передача временной метки в виде строки работает, но если я хочу передать объект Date, я теряю точность в микросекундах. Это ограничение JavaScript, поскольку объект Date имеет максимальное разрешение в миллисекундах. Чтобы обойти это, я преобразовал временную метку в 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
}
и
mytimestamptz: {
type: 'bigint',
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
Кроме того, я бы действительно предпочел иметь ее в качестве временной метки.
Возможно ли это?
Спасибо
Комментарии:
1. «Передача bigint в мою текущую модель вызовет исключение» Не могли бы вы опубликовать исключение?
2. обновлен вопрос с исключением
3. Тоже ищу ответ на этот вопрос.