2014-10-31 12 views
5

Próbuję sterownik węzła Kasandra i utknąłem w problem podczas wstawiania rekordu, wygląda na to, że sterownik Kasandra nie jest w stanie wstawić wartości pływaka.ResponseError: Oczekiwany 4 lub 0 bajt int

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) 

Próbuję wykonać następujące zapytanie z kodem:

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'); 

parametr przekazany do execute() jest

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

gdzie

var locx = 32.09; 
var locy = 54.90; 

i wezwanie do wykonania lo OKS jak:

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) 
); 

PS kilka uwag, starając się zrozumieć problem:

  1. Ponieważ wydaje się, problem jest z pływakiem więc zmieniłem typu float (z Locx, locY) do int i ponownie uruchom kod. Taki sam błąd występuje. W związku z tym nie jest to problem związany konkretnie z float typu CQL.
  2. Następnie, próbowałem usunąć wszystkie int z zapytania INSERT i próbowałem wstawić tylko wartości nieliczbowe. Ta próba pomyślnie wprowadziła wartość do db. Dlatego wygląda to teraz, this problem may be associated with numeric types.

Odpowiedz

17

Następujące słowa są jak to jest odbierane z cassandra node driver data type documentation

Podczas kodowania danych, na normalne wykonać z parametrami, kierowca próbuje odgadnąć typ docelowego na podstawie typu wejściowego. Wartości typu Number będą kodowane jako podwójne (jako Number is double/IEEE 754 value).

Rozważmy następujący przykład:

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

Jeśli kolumna klucz jest typu int, wykonanie nie powiedzie się. Są dwa sposoby uniknięcia tego rodzaju problemu:

  1. przygotowania danych (zalecane) - przygotowuje zapytanie przed wykonaniem

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

  2. Hinting typów docelowych - Podpowiedź: pierwszym parametrem jest liczba całkowita "

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

Jeśli masz do czynienia z aktualizacją serii, to może Cię zainteresować this issue.

+1

Świetne szczegóły w odpowiedzi, miło, że wskazałeś na problem z serią. – jorgebg

+2

Pierwsze podejście działa dla mnie, dzięki –

Powiązane problemy