2014-03-03 38 views
0

我目前正在嘗試通過使用Node.js的Socket.io發送一些信息,但它看起來像我做錯了什麼,我真的不知道爲什麼。使用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放入該參數中,以便它可以被髮送。我錯過了什麼嗎?

編輯1:

當我發出我的容器變量之前記錄是這樣的:

{ callback: [Function: handler] } 
+0

您是否在'socket.emit'之前拋出了一個日誌來檢查容器對象是否您期望的? – sgress454

+0

看到編輯,它看​​起來像這裏沒有什麼奇怪的 – MaximeHeckel

+0

您的客戶端上的花括號是錯誤的地方看起來像。 –

回答

1

這裏實際上有一些錯誤。首先集裝箱是不是你認爲它是。它不是docker.containers.list()的結果,它是一個函數。

考慮到「你好」下面的例子

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

你好是返回「你好」,但你好是不相等的功能。

基本上,當你發送容器時,你實際上並沒有發送docker.containers.list()的結果,而是函數本身。

你的第二個問題是你正在使用異步函數,但是你並沒有等待這個函數的回調來發送你的數據。

因此,基本上與您當前的代碼,你在錯誤的時間發送錯誤的東西。

你需要爲了使事情的工作做的很可能是這樣的:

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

還沒有嘗試過,但它應該工作!

0

你的客戶端代碼如下所示:

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

謝謝,但這只是一個錯誤,而不是在我的實際代碼中 – MaximeHeckel