我正在尝试使用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");
});
});
我在服务器端使用骨架文件。
答案 0 :(得分:1)
我以前见过这个问题。 原因是收到的struct消息无效,因为它没有设置thrift中“required”的字段!
请确保客户端设置了所有必填字段。
PS:我不知道如何检查节点js代码。我用C ++编写代码,我可以用__isset机制
来检查