获取TProtocolException:服务器端的node.js thrift客户端无效数据

时间:2013-04-08 06:38:14

标签: node.js thrift

我正在尝试使用node.js thrift客户端。我在服务器端遇到错误

TSimpleServer异常:N6apache6thrift8protocol18TProtocolExceptionE:TProtocolException:数据无效

如何解决此问题?

我的示例.thrift文件是:

struct Person{
1: required string name_;
2: required map<i64,string> attribute1_;
3: required map<i64,i64> attribute2_;
4: required map<i64,string> attribute3_;
}

service ProcessPerson { 
 void DoPerson(
       1: required list<Person> person_array 
         )
}

node.js客户端代码是:

var thrift = require('thrift');
var ttransport = require('./node_modules/thrift/lib/thrift/transport.js');
var tprotocol = require('./node_modules/thrift/lib/thrift/protocol.js');
var b_conn = thrift.createConnection('localhost', 9090, {transport: ttransport.TBufferedTransport ,protocol: tprotocol.TBinaryProtocol});
var ServicePerson = require('./person_js/ProcessPerson.js');
var type = require('./person_js/person_types');

b_conn.on('error', function(err) {
   console.error("error");
   console.error(err);
});

b_conn.on('connect', function(data) {
   console.log('on conect');
   var client = thrift.createClient(ServicePerson, b_conn);

   var person_list = new Array();
   var person_obj = new type.Person({name_:"aa", attribute1_:"",attribute2_:"",attribute3_: ""  });


   console.log(person_obj);
   person_list.push(person_obj);
   client.DoPerson(person_list, function() {
       console.log("Hi");
   });

});

我在服务器端使用骨架文件。

1 个答案:

答案 0 :(得分:1)

我以前见过这个问题。 原因是收到的struct消息无效,因为它没有设置thrift中“required”的字段!

请确保客户端设置了所有必填字段。

PS:我不知道如何检查节点js代码。我用C ++编写代码,我可以用__isset机制

来检查