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老是收不到,请老鸟赐教~


5 回复

回复:“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() 即可。而对于有返回值的方法(如 addunameget),应该使用 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时没有接收到返回值的问题。我们来分析一下你提供的代码,并提供一些可能的解决方案。

分析

  1. 服务端代码

    • adduname 方法应该返回一个字符串,但是你在调用 callback("MMMMM") 的时候没有传递正确的参数类型。
    • get 方法在成功获取到用户信息后应该通过 callback(null, user) 返回用户对象。
  2. 客户端代码

    • 在调用 addunameget 方法时,确保正确处理回调函数中的错误和结果。

解决方案

服务端代码修正

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 方法)。

通过这些修改,你应该能够解决没有接收到返回值的问题。

回到顶部