node.js cassandra cassandra-2.0

node.js - ResponseError: 4 o 0 bytes esperados int



cassandra cassandra-2.0 (1)

Estoy probando el controlador de nodo de cassandra y me he quedado atrapado en un problema al insertar un registro, parece que el controlador de cassandra no puede insertar valores flotantes.

Problem: When passing int value for insertion in db, api gives following error: Debug: hapi, internal, implementation, error ResponseError: Expected 4 or 0 byte int (8) at FrameReader.readError (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/readers.js:291:13) at Parser.parseError (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:185:45) at Parser.parseBody (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:167:19) at Parser._transform (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:101:10) at Parser.Transform._read (_stream_transform.js:179:10) at Parser.Transform._write (_stream_transform.js:167:12) at doWrite (_stream_writable.js:225:10) at writeOrBuffer (_stream_writable.js:215:5) at Parser.Writable.write (_stream_writable.js:182:11) at write (_stream_readable.js:601:24)

Estoy tratando de ejecutar la siguiente consulta desde el código:

INSERT INTO ragchews.user (uid ,iid ,jid ,jpass ,rateCount ,numOfratedUser ,hndl ,interests ,locX ,locY ,city ) VALUES (''uid_1'',{''iid1''},''jid_1'',''pass_1'',25, 10, {''NEX1231''}, {''MUSIC''}, 21.321, 43.235, ''delhi'');

el parámetro pasado a execute() es

var params = [uid, iid, jid, jpass, rateCount, numOfratedUser, hndl, interest, locx, locy, city];

dónde

var locx = 32.09; var locy = 54.90;

y llamada para ejecutar se ve así:

var addUserQuery = ''INSERT INTO ragchews.user (uid ,iid ,jid ,jpass ,rateCount ,numOfratedUser ,hndl ,interests ,locX ,locY ,city) VALUES (?,?,?,?,?,?,?,?,?,?,?);''; var addUser = function(user, cb){ console.log(user); client.execute(addUserQuery, user, function(err, result){ if(err){ throw err; } cb(result); }); }; CREATE TABLE ragchews.user( uid varchar, iid set<varchar>, jid varchar, jpass varchar, rateCount int, numOfratedUser int, hndl set<varchar>, interests set<varchar>, locX float, locY float, city varchar, favorite map<varchar, varchar>, PRIMARY KEY(uid) );

PD Algunas observaciones al tratar de entender el problema:

  1. Como parece, el problema es con float, así que cambié el tipo float (de locX, locY) a int y volví a ejecutar el código. El mismo error persiste. Por lo tanto, no es un problema asociado específicamente al tipo de CQL flotante.
  2. A continuación, intenté eliminar todos los int de la consulta INSERT e intenté insertar solo valores no numéricos. Este intento ingresó con éxito el valor en db. Por lo tanto, parece que ahora que this problem may be associated with numeric types .

Las siguientes palabras son las que se recogen de la documentación del tipo de datos del controlador del nodo de cassandra

Al codificar datos, en una ejecución normal con parámetros, el controlador intenta adivinar el tipo de destino en función del tipo de entrada. Los valores de tipo Número se codificarán como dobles (como Número es el valor doble / IEEE 754).

Considere el siguiente ejemplo:

var key = 1000; client.execute(''SELECT * FROM table1 where key = ?'', [key], callback);

Si la columna clave es de tipo int, la ejecución falla. Hay dos formas posibles de evitar este tipo de problema:

  1. Prepare los datos (recomendado) - prepare la consulta antes de la ejecución

    client.execute(''SELECT * FROM table1 where key = ?'', [key], { prepare : true }, callback);

  2. Sugerencia de los tipos de destino - Sugerencia: el primer parámetro es un número entero

    client.execute(''SELECT * FROM table1 where key = ?'', [key], { hints : [''int''] }, callback);

Si está tratando con la actualización de lotes, entonces este problema puede ser de su interés.