Node.js 将套接字作为socket.io参数传递?

Node.js 将套接字作为socket.io参数传递?,node.js,socket.io,node-request,Node.js,Socket.io,Node Request,大体上,我有以下工作流程: 用户要求提供具有特定标题的文章 客户端Socket.io发出事件并将标题作为数据传递 在服务器端,node向API发出http请求,并收集有关该文章的相关信息 完成后,服务器向客户端发送该信息 由于4依赖于3,我的理解是需要在回调中捕获它以实现同步行为。这给了我这个: io.on('connection', function(socket){ socket.on('need data', function(msg) { getLinkBacks(msg,

大体上,我有以下工作流程:

  • 用户要求提供具有特定标题的文章
  • 客户端Socket.io发出事件并将标题作为数据传递
  • 在服务器端,node向API发出http请求,并收集有关该文章的相关信息
  • 完成后,服务器向客户端发送该信息
  • 由于4依赖于3,我的理解是需要在回调中捕获它以实现同步行为。这给了我这个:

    io.on('connection', function(socket){
      socket.on('need data', function(msg) {
        getLinkBacks(msg, socket);
      });
    });
    
    
    var getLinkBacks = function(title, socket) {
      request.get(/* relevant url */, function(err, res, body) {
        socket.emit("data", body);
      });
    };
    
    io文档中没有提到异步方法,传递套接字而不是回调函数感觉很奇怪,回调函数更像是Node-y。我是否使用了糟糕的技术或错误地思考了问题,或者这是发出异步方法响应的标准方式


    注意:我本来会在代码评审中提到这个,但他们没有Socket.IO的标记,这让我觉得它更适合这里。

    我同意你的观点,节点的样式是传递回调函数,所以我将重写此代码如下:

    io.on('connection', function(socket){
      socket.on('need data', function(msg) {
        getLinkBacks(msg, function(content) {
          socket.emit("data", content);
        });
      });
    });
    
    
    var getLinkBacks = function(title, fn) {
      request.get(/* relevant url */, function(err, res, body) {
        fn(body);
      });
    };
    
    这将使应用程序的每个部分保持隔离,并且
    getLinkBacks
    函数不必知道什么是
    socket
    。这当然是一个很好的编程实践。此外,您还可以在应用程序的其他部分中重用
    getLinkBacks
    功能,这些部分未与
    socket
    对象连接

    p.S.我推荐罗伯特·马丁的《干净的代码:敏捷软件工艺手册》。他就如何构造代码以使其“干净”给出了非常有价值的建议

    祝你好运