2013-01-14 82 views
3

我寫了一個服務器的簡約示例node.js與我想要獲取客戶端連接的控制檯通知。我使用以下版本的模塊的爲什麼我在我的快遞服務器上收到'無法獲取/'?

所以我寫了這一點:

app.js

var socket = require('socket.io'); 
var express = require('express'); 
var http = require('http'); 

var app = express(); 

var server = http.createServer(app); 

var io = socket.listen(server); 
//var io = socket.listen(app); 

io.sockets.on('connection',function(client){ 
     console.log("Client connected..."); 

     client.emit('messages', {hello: 'world'}); 
}); 

app.listen(8080); 

index.html

<script src="node_modules/socket.io/lib/socket.io.js"></script> 
<script> 
    var server = io.connect("http://localhost:8080"); 

    server.on('messages', function(data){ 
     alert(data.hello); 
    }); 

</script> 

我有我的目錄結構如下:

|-- app.js 
|-- index.html 
`-- node_modules 
    |-- express 
    | |-- bin 
    | |-- client.js 
    | |-- History.md 
    | |-- index.js 
    | |-- lib 
    | |-- LICENSE 
    | |-- Makefile 
    | |-- node_modules 
    | |-- package.json 
    | |-- Readme.md 
    | `-- test.js 
    `-- socket.io 
     |-- benchmarks 
     |-- History.md 
     |-- index.js 
     |-- lib 
     |-- LICENSE 
     |-- Makefile 
     |-- node_modules 
     |-- package.json 
     `-- Readme.md 

回答

9

你行:

<script src="node_modules/socket.io/lib/socket.io.js"></script> 

<script src="/socket.io/socket.io.js"></script> 

通過d更換對此,你直接通過socket.io的內部靜態服務器而不是ExpressJS本身爲客戶端提供靜態socket.io.js模塊!

編輯1:

哦,我忘了提及如何爲您的index.html文件所以基本上你需要設置

var app = express(); 

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

,然後把你的index.html文件在您/public目錄

編輯2 :(解釋)

ExpressJS通過內部靜態文件處理程序提供靜態文件。 app.use(express.static(__dirname + '/public'));行實際上會將傳遞給node.js的請求重新路由到公用文件夾。另一方面,Socket.io(作爲一個單獨的庫)擁有它自己的方法來處理它的靜態文件,並且只有包含URL的GET請求才會觸發它:/socket.io/socket.io.js(儘管還有另一個Flash文件.swf,它是服務於不支持Websockets的瀏覽器)

您可以從ExpressJS APISocket.io wiki瞭解更多信息。

+0

這工作,謝謝。你能解釋爲什麼我應該使用這個路徑到'socket.io'和它是如何工作的(它在這裏尋找它) – Patryk

+0

當然;)我編輯了答案 – drinchev

相關問題