我在合理的绳索的尽头试图理解为什么我的一些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
,从而进行了未准备好的查询。我不知道实际的差异是什么,但是一旦我做好了准备,事情就开始在这种特殊情况下发挥作用。但我仍然真的想知道如何调试这些问题,我会再遇到它们。
答案 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);
访问documentation或Uuid API docs了解详情。