首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RangeError:连接节点js中的cassandra数据库时超出范围的索引

RangeError:连接节点js中的cassandra数据库时超出范围的索引
EN

Stack Overflow用户
提问于 2017-02-08 16:53:03
回答 2查看 3.1K关注 0票数 1

我正在从事NodeJS项目,并尝试使用cassandra驱动程序包从存储在cassandra数据库中的表中选择数据,然后使用以下一行启动客户端连接:

代码语言:javascript
复制
const cassandra = require('cassandra-driver');
const cassandraClient = new cassandra.Client({ contactPoints: ['192.168.0.253'], keyspace: 'test' });

有时,当我调用url时,引擎成功地获取结果,顺便说一句,有时会引发以下错误:

代码语言:javascript
复制
{ [RangeError: index out of range]
  coordinator: '192.168.0.253:9042',
  query: 'SELECT * FROM table where hidden=false ALLOW FILTERING' }

当cassandra表最近更新时,通常会引发此错误!我不知道这是否重要,但还有另一个服务连接到cassandra数据库并插入新数据,这与问题有关吗?我该如何解决这个错误?

如果这两个服务是造成此错误的原因,那么在对cassandra表进行主动服务写入时,是否可以使cassandra表不被阻塞(读和写),意味着幽灵读取没有问题?

堆栈错误:

代码语言:javascript
复制
{ [RangeError: index out of range]
  coordinator: '192.168.0.253:9042',
  query: 'SELECT * FROM table where hidden=false ALLOW FILTERING' }
RangeError: index out of range
    at checkOffset (buffer.js:663:11)
    at Buffer.readInt32BE (buffer.js:828:5)
    at Function.Long.fromBuffer (/home/l.alassadi/alarm-socket/node_modules/cassandra-driver/lib/types/index.js:466:25)
    at Encoder.decodeLong (/home/l.alassadi/alarm-socket/node_modules/cassandra-driver/lib/encoder.js:133:17)
    at Encoder.decodeTimestamp (/home/l.alassadi/alarm-socket/node_modules/cassandra-driver/lib/encoder.js:142:26)
    at Encoder.decode (/home/l.alassadi/alarm-socket/node_modules/cassandra-driver/lib/encoder.js:1202:18)
    at Parser.parseRows (/home/l.alassadi/alarm-socket/node_modules/cassandra-driver/lib/streams.js:377:36)
    at Parser.parseResult (/home/l.alassadi/alarm-socket/node_modules/cassandra-driver/lib/streams.js:335:10)
    at Parser.parseBody (/home/l.alassadi/alarm-socket/node_modules/cassandra-driver/lib/streams.js:185:19)
    at Parser._transform (/home/l.alassadi/alarm-socket/node_modules/cassandra-driver/lib/streams.js:137:10)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-14 11:25:07

TLDRcassandra-driver v3.6.0中固定

RangeError是由cassandra-driver中的一个问题引起的,特别是它如何解码来自db服务器的数据。它出现在以下条件:

  1. 该表包含一个具有map类型的列。
  2. 映射的值类型不可为空
  3. 所选行具有上述列。
  4. 列(映射)的值有一个没有值的键(不太确定它是如何实现的,但它是)

以下是所有可空类型:

  • 文本
  • ascii
  • varchar
  • 自定义
  • 斑点

长话短说,当映射中不可空类型(如int)的字段被序列化为空缓冲区时,驱动程序不会处理这种情况。在这种情况下,驱动程序将无条件地尝试从缓冲区读取与类型大小相等的字节数,并在出现所述错误时失败。

经过调查,我向cassandra-driver提交了一个cassandra-driver。它已在3.6.0中被接受和发布。

票数 2
EN

Stack Overflow用户

发布于 2017-11-09 03:54:48

在从表中提取数据时,我也收到了相同的错误。由于错误发生在Buffer.readInt32BE,所以猜测是在解析字段时出现的数字类型。

查看堆栈跟踪,转到函数Function.Long.fromBuffer并打印传递的bytes参数。现在来看一下我的查询,它有两个Timestamp类型的字段,甚至可以表示为Integer类型。

我的查询是在这里select item_id, created_date, modified_date from mytable。修改了库方法以打印它在encoder.js中遇到的值

代码语言:javascript
复制
 this.decodeLong = function (bytes) {
    console.log("---->" + Long.fromBuffer(bytes));
    return Long.fromBuffer(bytes);
 };

发现前三个值在执行我的服务方法时被打印出来。由于它是失败的第四项,而且我的查询只有两种数值类型,所以得出的结论是,异常发生在第二行的modified_date字段的解析过程中。

尝试更新cassandra-driver,问题仍然存在。删除引起问题的行,并解决了这一问题。因此,我想,再次将字段更新为不同的值应该可以解决这个问题。看起来和卡桑德拉的数据不一致。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42119104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档