2014-04-20 27 views
4

所以我試圖讓聊天工作在我的網站上,當我在本地進行測試時,它工作得很好,因爲我本地主機上的端口8080是可用和所有的好東西。但是現在我將代碼推送到了我的Heroku應用程序,當我嘗試加載聊天頁面時,出現錯誤,指出它無法獲取localhost:8080/socket.io/socket.io.js。Node.js /socket.io/socket.io.js not found 4.0

我見過node.js /socket.io/socket.io.js not found 並嘗試了這些建議,但都沒有成功,甚至將socket.io.js文件移動到資源文件中也不起作用。我猜這是因爲我使用Express 4.0?

任何幫助,將不勝感激 感謝

編輯: 所以要增加更多的細節,因爲我的問題可能顯得有點模糊,這是我的相關app.js代碼:

var client = require('socket.io').listen(8080).sockets; 

在我玉文件聊天頁面,我有:

script (src = `'http://localhost:8080/socket.io/socket.io.js`') 

,後來

var socket = io.connect(`'http://localhost:8080`'); 

而這一切工作在本地主機(我加載在端口5000,socket.io連接到端口8080)。我用heroku工具帶使用'工頭開始'。

當我嘗試更改這些以在heroku上工作時,它會中斷,我不知道如何解決它。我希望這可以澄清這個問題。

編輯2: 我運行: 表達4.0.0

socket.io 0.9.16

節點0.10.x

感謝

+0

可以發佈錯誤消息 – vipulsodha

回答

7

您是否有在express的明確路線,它捕獲所有其他路線?像這樣的事情也許:

app.get("/", handlers.home); 
app.get("/..." ...); 
... 
app.get("*", handlers.error); 

這可能保持socket.io從能夠承載它自己的JS客戶端文件。有一種簡單的方法可以解決這個問題,因爲您可能已經在Express中設置了publicstatic文件夾。喜歡的東西:

app.use(express.static("public"));

建立一個叫做socket.io新文件夾,並將在適當的socket.io.js文件到文件夾說,所有應該很好。 但是請注意,有兩個文件名爲socket.io.js因此,如果您看到類似"Uncaught ReferenceError: require is not defined"這意味着您複製了「node-ey」服務器端文件。這是正確的客戶要複製的文件:

app_dir/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.min.js

注@BHendricks:我會剛剛發佈了爲您的評論的答覆,但我目前缺乏必要的聲譽。

編輯: OP的問題可能更多地與「本地主機」問題有關。當從客戶端連接時(比如說你的家庭IP),就你的瀏覽器所知 - localhost意味着與本地託管東西的機器連接。由於您的家庭計算機(或手機)沒有託管socket.io,因此失敗。

您需要做的是讓您的服務器嵌入套接字連接信息(全限定主機名,ip等)。這可以在服務器用客戶端連接「呈現」頁面時完成。

3

當你去會發生什麼到http://localhost:8080/socket.io/socket.io.js

404是否?如果確實如此,則需要確保將其放在Express設置爲靜態服務的目錄中。

app.use(express.static(__dirname + '/public')); 

然後把你的socket.io.js文件public/socket.io/socket.io.js(相對於你的app.js文件)

重新啓動服務器,看看能否解決。

基本上,Express不會從文件系統靜態提供文件,除非您明確告訴它從哪個映射。

+0

我試過這種方法,並將腳本行腳本(src =''http:// localhost:8080/socket.io/socket.io.js'')更改爲(src =''/ socket.io/socket.io.js'')現在我得到:Uncaught ReferenceError:require is not defined – BHendricks

+0

謝謝!這很好。如果你正在縮小/醜化你的客戶端JS等,這提供了一種方法來選擇退出。非常感激。 – arcseldon