用socket.io写入空对象

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

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

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

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' } ] 

但是我唯一能得到客户端的是:Object {}

和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' } ] 

参数部分是空的。 我真的不知道如何将容器列表JSON放入该参数,以便它可以被发送。 我错过了什么吗?

编辑1:

当我login之前发射我的容器variables看起来像这样:

 { callback: [Function: handler] } 

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

考虑下面的例子

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

hello是返回“hello”的函数,但hello不等于“hello”。

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

你的第二个问题是你正在使用一个asynchronous函数,但是你并没有等待这个函数的callback来发送你的数据。

所以基本上你现在的代码是在错误的时间发送错误的东西。

你需要做什么才能使事情工作可能是这样的:

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

还没有尝试过,但它应该工作!

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

 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); });