2017-02-08 8 views
0

Я работаю над проектом NodeJS, и я попытался выбрать данные из таблицы, хранящейся в базе данных cassandra, используя пакет cassandra-драйвера, Я запускаю клиентское соединение используя следующую строку:RangeError: индекс вне диапазона при подключении к dassse cassandra в узле js

const cassandra = require('cassandra-driver'); 
const cassandraClient = new cassandra.Client({ contactPoints: ['192.168.0.253'], keyspace: 'test' }); 

иногда, когда я называю URL, двигатель fetchs результат успешно, кстати, иногда поднимает эту ошибку:

{ [RangeError: index out of range] 
    coordinator: '192.168.0.253:9042', 
    query: 'SELECT * FROM table where hidden=false ALLOW FILTERING' } 

эта ошибка обычно поднимают, когда таблица Cassandra недавно обновлен ! Я не знаю, является ли это важным, но есть еще одна служба, подключаемая к базе данных cassandra и вставляющая новые данные, связано ли это с проблемой? и как я могу решить эту ошибку?

Если эти две причины являются причиной этой ошибки, есть ли способ сделать таблицу cassandra не заблокированной (чтение и запись) при активной записи службы в таблицу cassandra, значит, нет проблем с чтением призраков?

ошибка стека:

{ [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) 
+0

Не знаете, что могло бы произойти там. Вы можете распечатать стек ошибки (console.log (err.stack)). Также, какую версию драйвера nodejs вы используете, и какова версия вашего кластера C *? –

+0

@ AndyTolbert Я напечатал стек ошибок и отредактировал вопрос. версия для кассандры: [cqlsh 5.0.1 | Cassandra 3.9 | CQL spec 3.4.2 | Собственный протокол v4] Node js version: v5.9.1 версия cassandra-драйвера: 3.2.0 , но я не понимаю, что вы подразумеваете под c * cluster version? – Luay

+0

Похоже на ошибку драйвера ... Можете ли вы воспроизвести ее в среде разработчиков? Не могли бы вы разместить схему таблицы? – jorgebg

ответ

0

Я получил ту же ошибку, делая выборку из таблицы. Так как ошибка равна Buffer.readInt32BE, то догадывается, что она обрабатывает поля, которые могут иметь числовой тип.

Глядя на стек, мы перешли к функции Function.Long.fromBuffer и напечатали аргумент bytes, который проходит. Теперь, глядя на мой запрос, который имел два поля типа Timestamp, которые могут быть даже выражены как Integer.

Запрос мой запрос select item_id, created_date, modified_date from mytable. Модифицированные библиотеки метод, чтобы напечатать значения, с которыми он сталкивается в encoder.js:

this.decodeLong = function (bytes) { 
    console.log("---->" + Long.fromBuffer(bytes)); 
    return Long.fromBuffer(bytes); 
}; 

Найдено, что первые три значения получения печататься при выполнении моего метода службы. Поскольку это был четвертый элемент, получивший отказ, и мой запрос состоял всего из двух числовых типов, пришел к выводу, что исключение было во время разбора modified_date, поданного второй строкой.

Пробовал обновлять cassandra-driver, вопрос сохранялся. Удалил строку, которая вызывала проблему, и разрешила ее. Поэтому, я думаю, обновление этого поля до другого значения должно решить это. Похоже на несоответствие данных кассандры.