0

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

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

});

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

4

1 回答 1

1

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

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

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

于 2013-10-28T05:50:10.513 回答