我有一段代码,每当用户访问这个特定的端点时,它都应该向python客户端发送一条消息,然后python客户端获取一些数据,然后将其作为回调返回,这样我就可以向用户显示这些数据。
这是服务器端代码(NodeJS):
app.get('/hueapi/lights', verifyToken, (req,res) => {
const bridgeIDFromApp = req.header('bridgeID');
const socketID = socketRefDic[bridgeIDFromApp]['socketID'];
io.to(socketID).emit('getAllLights', 'getAllLights', function(data){
res.send(data); // The callback function that shows the data given by the python client
});
});它只是将一个简单的'getAllLights‘消息发送到有问题的python客户端,然后运行提供数据的函数。
这是客户端代码(python):
def getAllLights(data):
lightData = requests.get('http://localhost:4000/lights/')
return lightData是我做错了回电还是?我只想在检索数据后将数据直接发送回用户。
编辑:
我现在正在使用io.to(...).emit(...)而不是io.send(...).emit(...),但我仍然收到错误,说我正在广播,但我没有,不是吗?
发布于 2021-07-01 08:09:36
我认为ack方法不会为您工作,除非它也在python端实现。你仍然收到广播错误的原因是因为io.to没有返回一个套接字,它返回了一个可以广播的房间。
在客户端只有一个单独的端点可能会更容易。在我看来,您的python代码甚至不会尝试这样做。python代码应该仍然能够写入套接字。
因此,要实现自己的ack函数,只需将ack消息写入套接字即可。如果需要对其进行状态命名空间,则必须为python代码包含一个地址,以便在getAllLights消息中引用该地址。
节点:
app.get('/hueapi/lights', verifyToken, (req,res) => {
const bridgeIDFromApp = req.header('bridgeID');
const socketID = socketRefDic[bridgeIDFromApp]['socketID'];
const uniqAck = "some unique endpoint path";
const socket = getSocketByID(socketID);
socket.on(uniqAck, (data) => res.send);
socket.emit('getAllLights', 'getAllLights:'+uniqAck);
});Python:
def getAllLights(data):
lightData = requests.get('http://localhost:4000/lights/');
return (lightData, split(data, ":")[1]); // split if its not already done by this point.
// capture 'value' from getAllLights when it is called...
socket.emit(value[1], value[0]); https://stackoverflow.com/questions/62920907
复制相似问题