Nodejs走thrift 无返回值,求教
Nodejs走thrift 无返回值,求教
按例子已定义接口: struct User{ 1: string uid, 2: string uname, 3: bool usex, 4: i16 uage, } service UserService{ void add(1: User u), void adduname(1: string uname), User get(1: string uid), }
服务端代码片: var server=thrift.createServer(UserService, { add:function(user,callback){ console.log(“add stored:”,user.uname); users[user.uid]=user; console.log(users); callback();}, adduname:function(x,callback){ console.log(“adduname stored:”,x); callback(“MMMMM”);}, get:function(uid,callback){ console.log(“get received:”, uid); console.log(users[uid]); callback(); }
}
);
客户端代码片: client.adduname(“cccc”,function(err, res){ console.log(err); console.log(res); connection.end(); });
var cc=‘112’; client.get(cc,function(err, res){ // console.log(err); console.log(res); connection.end(); });
不知道为什么res老是收不到,请老鸟赐教~
回复:“Nodejs走thrift 无返回值,求教”
您好!感谢您的提问。从您提供的信息来看,问题可能出在服务端和客户端的处理方式上。特别是在处理没有返回值的方法时,需要特别注意。
服务端代码分析
首先,我们来看一下服务端的代码:
var server = thrift.createServer(UserService, {
add: function(user, callback) {
console.log("add stored:", user.uname);
users[user.uid] = user;
console.log(users);
callback(); // 正确调用回调函数
},
adduname: function(x, callback) {
console.log("adduname stored:", x);
callback(null, "MMMMM"); // 返回结果应包括错误对象
},
get: function(uid, callback) {
console.log("get received:", uid);
var user = users[uid];
if (user) {
callback(null, user); // 返回结果应包括错误对象
} else {
callback(new Error("User not found"), null);
}
}
});
关键点在于 callback
的调用方式。对于没有返回值的方法(如 add
),只需要调用 callback()
即可。而对于有返回值的方法(如 adduname
和 get
),应该使用 callback(error, result)
的形式,其中第一个参数用于传递错误对象,第二个参数用于传递结果。
客户端代码分析
接下来,我们来看一下客户端的代码:
client.adduname("cccc", function(err, res) {
console.log(err);
console.log(res);
connection.end();
});
var cc = '112';
client.get(cc, function(err, res) {
console.log(err);
console.log(res);
connection.end();
});
这里需要注意的是,adduname
方法没有返回值,因此 res
参数不会接收到任何数据。而 get
方法有返回值,因此 res
参数会包含返回的数据。如果用户不存在,err
参数将包含一个错误对象。
示例修正后的完整代码
以下是一个完整的示例代码,以确保服务端和客户端都能正确处理:
服务端代码
const thrift = require('thrift');
const UserService = require('./gen-nodejs/UserService');
const ttypes = require('./gen-nodejs/user_types');
const users = {};
const handler = {
add: function(user, callback) {
console.log("add stored:", user.uname);
users[user.uid] = user;
console.log(users);
callback();
},
adduname: function(x, callback) {
console.log("adduname stored:", x);
callback(null, "MMMMM");
},
get: function(uid, callback) {
console.log("get received:", uid);
const user = users[uid];
if (user) {
callback(null, user);
} else {
callback(new Error("User not found"), null);
}
}
};
const server = thrift.createServer(UserService, handler);
server.listen(9090, () => {
console.log('Thrift server is listening on port 9090');
});
客户端代码
const thrift = require('thrift');
const UserService = require('./gen-nodejs/UserService');
const ttypes = require('./gen-nodejs/user_types');
const client = thrift.createClient(UserService, {host: 'localhost', port: 9090});
client.adduname("cccc", function(err, res) {
console.log(err);
console.log(res);
connection.end();
});
const cc = '112';
client.get(cc, function(err, res) {
console.log(err);
console.log(res);
connection.end();
});
通过以上调整,希望可以解决您遇到的问题。如果还有其他疑问,欢迎继续交流!
这个问题解决了吗
先格式化一下代码吧。
Thrift在NodeJs的实现很操蛋。
传的参数如果不是指定的构造函数,那么报一个让你莫名其妙的错误。
如果服务端返回的值不符合类型定义,那么请求会一直挂起,没有返回值,也不会报错。你看看是不是因为这个。
来自酷炫的 CNodeMD
你服务端callback并没有返回值,别折腾官方那个包了,坑太多,用这个吧https://github.com/leaves4j/n-thrift From Noder
根据你的描述,你遇到了在Node.js中使用Thrift时没有接收到返回值的问题。我们来分析一下你提供的代码,并提供一些可能的解决方案。
分析
-
服务端代码
adduname
方法应该返回一个字符串,但是你在调用callback("MMMMM")
的时候没有传递正确的参数类型。get
方法在成功获取到用户信息后应该通过callback(null, user)
返回用户对象。
-
客户端代码
- 在调用
adduname
和get
方法时,确保正确处理回调函数中的错误和结果。
- 在调用
解决方案
服务端代码修正
var server = thrift.createServer(UserService, {
add: function (user, callback) {
console.log("add stored:", user.uname);
users[user.uid] = user;
console.log(users);
callback(); // 正确调用 callback
},
adduname: function (x, callback) {
console.log("adduname stored:", x);
callback(null, "MMMMM"); // 确保正确传递参数
},
get: function (uid, callback) {
console.log("get received:", uid);
if (users[uid]) {
callback(null, users[uid]); // 传递用户对象
} else {
callback(new Error("User not found"), null); // 处理错误情况
}
}
});
客户端代码修正
client.adduname("cccc", function (err, res) {
if (err) {
console.error("Error in adduname:", err);
} else {
console.log("Result from adduname:", res);
}
connection.end();
});
var cc = '112';
client.get(cc, function (err, res) {
if (err) {
console.error("Error in get:", err);
} else {
console.log("Result from get:", res);
}
connection.end();
});
关键点总结
- 确保服务端在调用
callback
时传递正确的参数类型。 - 在客户端正确处理回调函数中的错误和结果。
- 如果服务器端方法没有返回任何数据,则应确保客户端不会期望接收数据(如
add
方法)。
通过这些修改,你应该能够解决没有接收到返回值的问题。