2012-09-15 91 views
3

我有一個基本的Node.js &在Heroku上運行的Socket.io聊天應用程序,我想集成到我的主要rails網站。我明白這樣做的方法是有兩個獨立的Heroku應用程序 - 一個用於導軌,一個用於Node.js.在Heroku上橋接一個簡單的Node.js和Socket.io聊天應用程序

它似乎不像將客戶端html從節點應用程序移動到rails應用程序那樣簡單(在'io.connect();')中給它提供另一個應用程序的url)。

聊天應用服務器似乎自動調用客戶端index.html自己的應用程序,並且不允許外部源連接到它。刪除執行此操作的代碼(標記如下)不會使其工作。

我很痛心地Node.js & Socket.io和我希望這可能是一個相對簡單的修補程序。

我相信這裏後,我的功能在利亞姆·考夫曼的優秀軌/ node.js中/ socket.io例如工程 - 他的node.js服務器代碼是在這裏:https://github.com/liamks/Chatty-Node-Server/blob/master/chat-server.js

我試圖嘲弄我的應用程序的代碼就像他一樣,但還沒有能夠使其工作。他例如似乎使用'http'服務器,而我的使用'express'服務器 - 我想知道這可能是相關的。

任何幫助將不勝感激。

UPDATE:好了,所以事件的離奇轉,這要歸功於redhotvengeance的答覆下面我有這個工作 - 服務器啓動在Heroku和我的客戶端HTML和JavaScript進行連接。下面的偉大代碼。但問題是,客戶端html文件僅在Rails應用程序之外才連接!即在我的桌面上!當我把它放在rails應用程序的公共/文件夾或者我的本地主機的視圖中時,我什麼也得不到!這沒有意義。我檢查了它不是因爲我的資產管道中的任何其他隨機錯誤的JavaScript衝突,只是創建一個新的rails應用程序,並將公共文件夾中的html文件刪除 - 再次沒有 - 只是一個無法連接的HTML頁面。有沒有人知道這裏可能會發生什麼? Rails是否有一些安全功能可以停止與外部服務器的連接?

UPDATE 2:我被告知這與'同源策略'有關,而且我遇到了麻煩。有沒有辦法解決它?似乎利亞姆沒有這個問題。

客戶:

<script src="http://calm-sands-3826.herokuapp.com/socket.io/socket.io.js" type="text/javascript"></script> 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> 
<script> 
    var socket = io.connect('http://calm-sands-3826.herokuapp.com'); 

    // on connection to server, ask for user's name with an anonymous callback 
    socket.on('connect', function(){ 
     // call the server-side function 'adduser' and send one parameter (value of prompt) 
     socket.emit('adduser', prompt("What's your name?")); 
    }); 

    // listener, whenever the server emits 'updatechat', this updates the chat body 
    socket.on('updatelog', function (username, data) { 
     $('#log').append('<b>'+username + ':</b> ' + data + '<br>'); 
    }); 

    // listener, whenever the server emits 'updateusers', this updates the username list 
    socket.on('updateusers', function(data) { 
     $('#users').empty(); 
     $.each(data, function(key, value) { 
      $('#users').append('<div>' + key + '</div>'); 
     }); 
    }); 

</script> 
<div style="float:left;width:100px;border-right:1px solid black;height:300px;padding:10px;overflow:scroll-y;"> 
    <b>USERS</b> 
    <div id="users"></div> 
</div> 
<div style="float:left;width:300px;height:250px;overflow:scroll-y;padding:10px;"> 
    <div id="log"></div> 
</div> 

服務器:

var port = process.env.PORT || 5001; 

var io = require('socket.io').listen(parseInt(port)); 

io.configure(function(){ 
    io.set("transports", ["xhr-polling"]); 
    io.set("polling duration", 10); 
    io.set("close timeout", 10); 
    io.set("log level", 1); 
}) 

// usernames which are currently connected to the chat 
var usernames = {}; 

io.sockets.on('connection', function (socket) { 

    // when the client emits 'adduser', this listens and executes 
    socket.on('adduser', function(username){ 
     // we store the username in the socket session for this client 
     socket.username = username; 
     // add the client's username to the global list 
     usernames[username] = username; 
     // echo to client they've connected 
     socket.emit('updatelog', 'SERVER', 'you have connected'); 
     // echo globally (all clients) that a person has connected 
     socket.broadcast.emit('updatelog', 'SERVER', username + ' has connected'); 
     // update the list of users in chat, client-side 
     io.sockets.emit('updateusers', usernames); 
    }); 

    // when the user disconnects.. perform this 
    socket.on('disconnect', function(){ 
     // remove the username from global usernames list 
     delete usernames[socket.username]; 
     // update list of users in chat, client-side 
     io.sockets.emit('updateusers', usernames); 
     // echo globally that this client has left 
     socket.broadcast.emit('updatelog', 'SERVER', socket.username + ' has disconnected'); 
    }); 
}); 
+0

你說,你正在整合與Rails的節點 - 你的意思是你想在你的Rails應用程序頁面的一個或多個與您的節點服務器進行交互? – redhotvengeance

+0

是的 - 只是我的Rails應用程序中的一個頁面與我的節點服務器(這是一個單獨的Heroku應用程序)進行交互 – christian

回答

5

如果你正在嘗試做的是在你的Rails應用程序的頁面連接到您的單獨的Node.js應用程序運行socket.io,然後完全跳過設置Express。您並不想從您的Node應用程序實際提供頁面,只需將用戶連接到socket.io服務器即可。

比方說,您在Heroku上的Node.js應用程序被稱爲:my-awesome-socket-app

my-awesome-socket-app

var io = require('socket.io').listen(parseInt(process.env.PORT)); 

io.configure(function() { 
    io.set("transports", ["xhr-polling"]); 
    io.set("polling duration", 10); 
}); 

io.sockets.on('connection', function (socket) { 
    socket.on('disconnect', function() { 
    io.sockets.emit('user disconnected'); 
    }); 
}); 

然後,在Rails的頁面要連接到插座。IO服務器:

<script src="http://my-awesome-socket-app.herokuapp.com/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://my-awesome-socket-app.herokuapp.com'); 
    socket.on('connect', function (data) { 
    console.log('connected!'); 
    }); 
</script> 
+0

非常感謝 - 它的工作原理 - 參見上文。 – christian

相關問題