如何调试Cassandra验证错误

时间:2016-01-02 03:23:00

标签: node.js cassandra cql

我在合理的绳索的尽头试图理解为什么我的一些Cassandra查询在从NodeJS调用时不起作用。

TL; DR - 有没有办法在服务器端推理时启用调试验证失败的原因?

我的具体头脑攻击问题。 Cassandra 2.2.4,驱动程序2.2.2。鉴于以下表定义:

create table messages (id varchar,enterprise_id uuid,primary key(id, enterprise_id)

我传递了以下查询:

cassandra.execute("select id from messages where id = ? and enterprise_id = ?",
  [local,domain],{},...);

local是字符串类型,域是Uuid类型(由Cassandra从之前的查询中返回)。这会产生 8704的错误:字符串没有验证。。我确保将第一个arg转换为字符串,然后将第二个转换为Uuid或字符串,错误不会发生变化。我已打印出Client._innerExecute发出的对象,看起来不错:

cassandra request:{"streamId":null,"query":"select id from messages where id = ? and enterprise_id = ?",
"params":["fef86640-b0fb-11e5-8518-5b5a19241119","32d2a682-af07-4108-a15a-de6f8a75e811"],
"options":{"consistency":1,"fetchSize":5000,"prepare":false,"retryOnTimeout":true,
"prepared":true,"routingKey":null},"consistency":1,"hints":[]}

最后,服务器的调试(或任何其他)日志中绝对没有输出,表明存在任何类型的错误。考虑到J / S很难打印出对象"类型",它不清楚发送的是什么,以及服务器的期望是什么。

当然,直接在cqlsh中运行它可以正常工作:

cassandra@cqlsh:a> SELECT * from messages WHERE 
    ... id = '92ec8eb0-b0f9-11e5-8518-5b5a19241119' and
    ... enterprise_id = 32d2a682-af07-4108-a15a-de6f8a75e811 ;
 id | enterprise_id
----+---------------
(0 rows)

所以,我正在寻找一种方法来解释执行过程中发生的事情。

P.S。顺便说一下,当我干涉Cassandra驱动程序代码时,我意识到我使用了prepared而不是prepare,从而进行了未准备好的查询。我不知道实际的差异是什么,但是一旦我做好了准备,事情就开始在这种特殊情况下发挥作用。但我仍然真的想知道如何调试这些问题,我会再遇到它们。

1 个答案:

答案 0 :(得分:0)

uuid参数的预期javascript类型为Uuid

在你的情况下,它应该是:

const cassandra = require('cassandra-driver');
const query = 'select id from messages where id = ? and enterprise_id = ?';
client.execute(query, [ id, cassandra.types.Uuid.fromString(eid) ], callback);

访问documentationUuid API docs了解详情。