Javascript 是否可以在Socket.IO中执行服务器端回调

Javascript 是否可以在Socket.IO中执行服务器端回调,javascript,python,node.js,python-3.x,socket.io,Javascript,Python,Node.js,Python 3.x,Socket.io,有一个问题问了我一个确切的问题,但从来没有得到恰当的回答。我找不到任何其他地方可以帮助我解决这个非常烦人的问题 我有这个产品,它位于用户家中,连接到他们的网络。当他们在网络之外时,我希望他们能够安全地通过互联网连接访问世界上任何地方的上述产品。当我的应用程序需要数据(仅存储在家用产品上)时,它会执行以下步骤: 该应用程序向服务器发送请求,要求其从家中的产品中获取数据 服务器获取用户的请求,并通过socket.io向其产品发送消息 产品接收请求并获取数据(存储在本地)并将其返回到服务器(回调) 服

有一个问题问了我一个确切的问题,但从来没有得到恰当的回答。我找不到任何其他地方可以帮助我解决这个非常烦人的问题

我有这个产品,它位于用户家中,连接到他们的网络。当他们在网络之外时,我希望他们能够安全地通过互联网连接访问世界上任何地方的上述产品。当我的应用程序需要数据(仅存储在家用产品上)时,它会执行以下步骤:

  • 该应用程序向服务器发送请求,要求其从家中的产品中获取数据
  • 服务器获取用户的请求,并通过socket.io向其产品发送消息
  • 产品接收请求并获取数据(存储在本地)并将其返回到服务器(回调)
  • 服务器接收回调发送的数据并将其发送回用户应用程序
  • 现在我知道使用socket.io可以在客户端进行回调,但为什么不能在服务器端进行回调呢

    目前,使用我现在拥有的代码,我得到一个错误,即广播时不支持回调

    服务器端代码(Nodejs):

    客户端代码(python):

    有没有办法解决这个问题,我觉得服务器端回调不受支持很愚蠢,或者我只是做错了什么


    问题是,多个不同的产品将同时连接到此服务器,因此回调将是将数据发送到正确位置的唯一逻辑方式。我见过人们自己进行回调的解决方案,但我需要它,这样可以一次性执行和发送此代码的多个实例,而不是将其分解为不同的emit函数。

    我发现了一个小而有效的解决方案,可以在几个小时的时间里用Socket.io进行服务器端调用

    我会尽可能详细地回答这个问题,就像我在互联网上看到的一样

    因此,对于那些(像我一样)将有多个客户端连接到同一台服务器,并且您希望使用回调以一种可管理的方式将数据从客户端发送回服务器,而不使用回调,因为我们无法使用回调。或者,对于那些希望在直接与特定套接字通话时具有回调功能的用户:

    例如,我的应用程序向我的服务器发出请求,请求获取保存在其他地方的数据(在我的例子中,我的应用程序请求获取一些灯的数据,这些灯保存在他们家的树莓pi上,因此他们可以随时随地访问这些数据)

    我的应用程序调用我的云API(Nodejs)的此端点:

    以及我的python客户机(位于我的用户家中)用于此相关功能:

        @sio.event
        def getAllLights(data):
                lightData = requests.get('http://192.168.0.55:5000/lights').json()
                output = {sio.eio.sid: lightData};
                sio.emit('lightDataCallback',output)
    
    分解此代码…(顶部的两个常量
    bridgeIDFromApp
    socketID
    只是我存储在服务器上的两个常量,以便服务器知道向何处发送数据)

  • 应用程序进行API调用,并通过套接字向保存数据的客户端发送消息:

    if(Object.keys(data) == socketID){
      res.send(data);
    }
    
    io.to(socketID.emit('getAllLights','getAllLights')

  • 我的python客户端接收命令,通过localIP获取所述数据,将其粘贴到与socketID连接的JSONObject中,以便我们知道数据返回服务器并发送回服务器时将数据发送到何处:

    sio.emit('lightDataCallback',输出)

  • 这就是它的创新之处,因为我们无法进行回调,我在函数中创建了一个侦听器,其中套接字对象首先用于连接用户。这是因为它将接收所有客户端发送到
    lightDataCallback
    emit函数的所有emit。因此,在socket对象函数中,我有以下代码来检索所述数据:

    socket.on('lightDataCallback', (socket) => {
      lightDataCallbackFunction(socket);
    });
    
    然后我们调用最初在第一个端点中实例化的函数 我们的应用程序从此发射器调用的:

    lightDataCallbackFunction = function(data){
    console.log(Object.keys(data))
    if(Object.keys(data) == socketID){
          res.send(data);
      }
    }
    
  • 现在,我们可以通过一个简单的
    res.send(data)
    将数据发送回客户端。但是,如果连接了数千个客户端,并且有很多人在运行同一个函数,那么您将遇到数据发送给错误的人的问题,因为无法判断函数和数据是否按顺序返回(可能他们家中的客户端raspberry pi检索数据很慢)

    为了确保它发送给正确的人,我有一个简单的if语句来检查返回到函数的数据是否真的是该人的。它检查数据中的socketID是否与执行请求的当前socketID相同,如果不相同,则在再次调用此函数并再次检查之前不要执行任何操作。如果是,那么我们可以安全地假设返回到函数的数据将发送给正确的人,因此我们可以发送数据:

    if(Object.keys(data) == socketID){
      res.send(data);
    }
    
    (在我返回到服务器的数据中是socketID,请看步骤2。这是我们用来标记数据所有者的数据)

    lightDataCallbackFunction = function(data){
    console.log(Object.keys(data))
    if(Object.keys(data) == socketID){
          res.send(data);
      }
    }
    
    if(Object.keys(data) == socketID){
      res.send(data);
    }