node.js - 使用 CQL 的 Cassandra 中的宽行 - 出现奇怪的错误

标签 node.js cassandra cql

我正在尝试在 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/

相关文章:

node.js - Express 3 - 提供静态脚本/样式 - 错误 : Failes to load resource (404)

database - 如何在 cassandra 中对表进行建模以根据 where 条件进行选择

cassandra - ScyllaDB - [无效查询] 消息 ="marshaling error: Milliseconds length exceeds expected (6)"

cassandra - 如何正确选择与索引匹配的分区键

javascript - 如何在 JS 中不断更新来自服务器的数据?

node.js - 在 React Native 中安装 Realm 后,找不到 module/../../node-pre-gyp

cassandra - 如何知道连接到 Cassandra 的本地客户端

Cassandra 主键允许重复

javascript - 无法下载动态创建的 ZIP 存档

cassandra - 有没有办法发现 Cassandra CQL 表结构?