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