ResponseError:期望4或0字节int
我正在尝试cassandra节点驱动程序,并插入一条logging卡在问题,它看起来像cassandra驱动程序无法插入浮点值。
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)
我试图从代码执行以下查询:
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');
传递给execute()
参数是
var params = [uid, iid, jid, jpass, rateCount, numOfratedUser, hndl, interest, locx, locy, city];
哪里
var locx = 32.09; var locy = 54.90;
并调用执行如下所示:
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一些观察,而试图了解这个问题:
- 因为看起来,问题是浮动,所以我改变types浮动(的locX,locY)为int并重新运行代码。 同样的错误依然存在。 因此,浮动CQLtypes不是特别关联的问题。
- 接下来,我试图从INSERT查询中删除所有int,并试图只插入非数字值。 这个尝试成功地把值input到db中。 因此现在看来,
this problem may be associated with numeric types
。
以下文字是从cassandra节点驱动程序数据types文档中挑选出来的
在对数据进行编码时,在正常执行参数的情况下,驱动程序会根据inputtypes尝试猜测目标types。 Numbertypes的值将被编码为double(Number是double / IEEE 754值)。
考虑下面的例子:
var key = 1000; client.execute('SELECT * FROM table1 where key = ?', [key], callback);
如果键列是inttypes,则执行失败。 有两种可能的方法来避免这种types的问题:
-
准备数据(推荐) – 在执行前准备查询
client.execute('SELECT * FROM table1 where key = ?', [key], { prepare : true }, callback);
-
暗示目标types – 提示:第一个参数是一个整数
client.execute('SELECT * FROM table1 where key = ?', [key], { hints : ['int'] }, callback);
如果你正在处理批量更新,那么这个问题可能是你的兴趣。