我正在尝试在 Cassandra 中存储博客的评论,并提出了这个架构(从 here 得到这个想法):
create table comments ( slug varchar, ts timestamp, value text, primary key (slug,ts));
使用 CQL(我使用带有 Helenus 驱动程序的 Node.js)我试图向其中添加一些数据,这是我到目前为止所得到的:
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'
我尝试将时间戳更改为所有不同的数据类型,但没有成功。非常奇怪的是,一开始,我的主键只是 slug 本身,然后它就起作用了。但是,我想将所有注释存储在按时间戳排序的一行中,因此我必须采用这种使用两列作为主键的方法。有什么想法吗?
编辑所以基于 rs_atl's建议,这是我尝试过的:
这一行:
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")
实际上确实在末尾添加了时区信息,但仍然没有运气。有什么想法吗?
最佳答案
您似乎使用了错误的 CQL 版本。您希望使用 CQL 3.0.0,但驱动程序默认为 CQL2。您需要在初始化时指定正确的CQL版本。
pool = new helenus.ConnectionPool({
hosts: ['localhost:9160'],
keyspace: 'blogks',
cqlVersion: '3.0.0'
});
还请确保您使用的是最新版本的 Helenus(目前为 0.6.2)。
关于node.js - 使用 CQL 的 Cassandra 中的宽行 - 出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14802658/