【问题标题】:Writing empty object with socket.io使用 socket.io 编写空对象
【发布时间】:2019-06-29 20:36:11
【问题描述】:

我目前正在尝试使用 Node.js 通过 Socket.io 发送一些信息,但看起来我做错了什么,我真的不知道为什么。

我的机器上有一些使用 Docker 的容器,我为我的应用程序使用 Docker.io 节点包以获得我想要的所有信息。

这是发送数据的服务器端函数

io.sockets.on('connection', function(socket){
   socket.emit('message',container);
});


var container = docker.containers.list(handler);

function handler(err, res) {
if (err) throw err;
console.log("data returned from Docker as JS object: ", res);
}

这是获取套接字消息的客户端代码

var socket = io.connect('/');
socket.on('message', function(data){
    console.log(data);
});

我通过套接字发送的数据(容器列表看起来)如下:

[ { Command: 'top ',
Created: 1393878688,
Id: 'fa46297fa16ff184673077545437a64f2adaf62db8774be696d76cc9f52b7881',
Image: 'ubuntu:12.04',
Names: [ '/cranky_archimedes' ],
Ports: [],
Status: 'Up 20 minutes' } ]

但我唯一得到客户端的是:对象{}

socket.io 日志向我发送了这个:

debug - websocket writing 5:::{"name":"message","args":[{}]}
[ { Command: 'top ',
Created: 1393878688,
Id: 'fa46297fa16ff184673077545437a64f2adaf62db8774be696d76cc9f52b7881',
Image: 'ubuntu:12.04',
Names: [ '/cranky_archimedes' ],
Ports: [],
Status: 'Up 20 minutes' } ]

args 部分为空。我真的不知道如何将容器列表 JSON 放入该 arg 以便它可以正确发送。我错过了什么吗?

编辑1:

当我在发出容器变量之前登录时,如下所示:

{ callback: [Function: handler] }

【问题讨论】:

  • 您是否在socket.emit 之前抛出了日志以检查容器对象是否符合您的预期?
  • 看编辑,这里好像没什么奇怪的
  • 您客户端上的花括号看起来位置不对。

标签: json node.js socket.io docker


【解决方案1】:

这里实际上有一些错误。第一个 container 不是你想的那样。它不是 docker.containers.list() 的结果,它是一个函数。

考虑以下示例

var hello = function(){
  return "hello";
}
console.log(hello); // [Function]
console.log(hello()); // hello

hello 是返回 "hello" 但 hello 不等于 "hello" 的函数。

基本上,当您发送容器时,您实际上并不是发送 docker.containers.list() 的结果,而是发送函数本身。

您的第二个问题是您正在使用异步函数,但您没有等待该函数的回调来发出数据。

因此,基本上使用您当前的代码,您在错误的时间发送了错误的内容。

为了让事情顺利进行,你需要做的可能是这样的:

io.sockets.on( 'connection', function( socket ) {
  docker.containers.list( function( err, res ) {
    socket.emit( 'message', res );
  });
});

没试过,应该可以的!

【讨论】:

    【解决方案2】:

    您的客户端代码如下所示:

    socket.on('message', function(data)){
        //this console.log is not actually inside the callback
        console.log(data);
    }
    

    它需要看起来像这样:

    socket.on('message', function(data) {
        //here the log is inside the callback
        console.log(data);
    });
    

    【讨论】:

    • 谢谢,但这只是一个错字,不在我的实际代码中
    猜你喜欢
    • 2023-03-15
    • 2015-09-30
    • 2019-02-12
    • 2013-10-26
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多