Я пытаюсь хранить комментарии для блога в Cassandra и придумал эту схему (идея взята из здесь):
create table comments ( slug varchar, ts timestamp, value text, primary key (slug,ts));
Используя CQL (я использую node.js с драйвером Helenus), я пытаюсь добавить некоторые данные к этому, вот что у меня есть до сих пор:
var helenus = require('helenus'),
pool = new helenus.ConnectionPool({
hosts: ['localhost:9160'],
keyspace: 'blogks'
});
pool.on('error', function(err) {
console.error(err.name, err.message);
});
module.exports.addComment = function(slug, comment,callback){
pool.connect(function(connErr,keyspace){
if(connErr){
callback(connErr);
return;
}
var cql = "INSERT INTO comments (slug,ts,value) VALUES (?, ?, ?);";
pool.cql(cql,[slug,serializeDate(new Date()),serializeJSON(comment)],function(err,results){
callback(err,results);
});
});
}
function serializeDate(date){
var dateSerializer = new helenus.Marshal('DateType');
return dateSerializer.serialize(date).toString('hex');
}
function serializeJSON(data){
var utf8Serializer = new helenus.Marshal('UTF8Type');
return utf8Serializer.serialize(JSON.stringify(data)).toString("hex");
}
Идея в том, что вы можете передать объект json комментария этому методу и отправить его в cassandra. Я вызываю это так, чтобы проверить:
var comments = require('./comments.js');
comments.addComment("myslug",{id:2,name:"Alex",comment:"Hello!"},function(e,r){
console.log(e);
console.log(r);
})
но всякий раз, когда я это делаю (я пробовал различные драйверы CQL), я получаю это загадочное сообщение об ошибке:
[HelenusInvalidRequestException: unable to coerce 'value' to a formatted date (long)] name: 'HelenusInvalidRequestException'
Я попытался изменить временную метку, чтобы она была разными типами данных, но безуспешно. Очень странно то, что сначала моим первичным ключом был просто сам слаг, а потом он заработал. Однако я хочу хранить все комментарии в одной строке, упорядоченные по отметке времени, поэтому мне пришлось использовать этот подход с использованием двух столбцов для первичного ключа. Есть идеи?
EDIT Итак, основываясь на предложении rs_atl, вот что я пробовал:
Эта строка:
dateSerializer.serialize(date).toString('hex')
на самом деле возвращал мусор (0000013ccfacf5c4), я, должно быть, неправильно понял, как использовать API. Итак, вот что я попробовал вместо этого:
Я попробовал только new Date().getTime()
, который в JS действительно возвращает эпоху в стиле Unix, но это не сработало, я получил ту же ошибку. Затем я попытался использовать moment.js, чтобы отформатировать строку:
moment().format("YYYY-MM-DD HH:mm:ss")
который, кажется, возвращает правильный формат, но снова. Та же ошибка. Затем я попробовал это:
moment().format("YYYY-MM-DD HH:mm") + "Z"
неудачно. Затем я попробовал это:
moment().format("YYYY-MM-DD HH:mmZ")
что на самом деле добавляет информацию о часовом поясе в конце, но все равно не повезло. Есть идеи?