2012-06-27 47 views
4

這讓我發瘋......雖然我有Express + Socket.io的工作版本,但似乎無法用out-of-機箱NPM安裝在新的項目文件夾中。任何人都可以指出我錯過了什麼......?這裏是我的過程:Express + socket.io:socket.io客戶端腳本是404

我在項目目錄(pwd)創建node_modules文件夾,然後執行:

npm install express 
npm install socket.io 

運行這兩個命令如預期把包在我的項目的node_modules文件夾中。現在,我建立了我與下列服務器:

var express = require('express'), 
    server = express.createServer().use(express.static(__dirname+'./public')).listen(8080), 
    io = require('socket.io').listen(server); 

public文件夾包含靜態資產爲我的申請。我的公共指數HTML頁面包括腳本標籤:

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

最後,我跑我的服務器腳本並轉到在Web瀏覽器中的應用。我的靜態公共文件都得到了正確的服務,但是我得到了404的/socket.io/socket.io.js。現在,我可以交換來自另一箇舊項目的express包,並使整個系統都能正常工作。不知何故,包實例配置不同,但我不知道如何重現。 Express網站提到了安裝依賴關係的一些問題,雖然運行npm install -d似乎沒有幫助(是否有一個特定的pwd,我需要在運行npm install -d?)。我想我在使用NPM進行安裝之後必須丟失一些有關配置新Express實例的重要信息。

感謝您的任何見解!

+1

express和socket.io的安裝版本是什麼?我剛剛完成了你所做的步驟,靜態資產和socket.io.js都很好。 –

+1

客戶端socket.io.js是動態生成的,它不應該與你的快速靜態服務器有關。 我可以獲得有關失敗路線的更多信息嗎? 檢查如果您轉到http:// localhost:8000/socket.io/socket.io.js或http:// localhost:8000/socket.io /(使用您正在運行的端口號替換8000你的應用程序) – Sdedelbrock

+0

同上蒂莫西說什麼...它適用於我的機器。雖然在Windows中,我不得不將路徑更改爲靜態文件,如下所示:__dirname +'/ public'(刪除了點) –

回答

6

好吧,所以我的例子實際上是我的代碼的縮寫,並且該示例代碼確實可行。我對問題的真正的代碼是一個有點雜亂,像這樣:

var server = express.createServer(); 

server 
    .use(server.router) 
    .use(express.static(__dirname+'/../public')) 
    .get('/api', function(req, res) { 
     res.write('API'); 
    }); 

server.listen(8080); 

var io = require('socket.io').listen(server); 

我這樣做固定在上面的代碼如下:

server = server.listen(8080); 

顯然,listen命令會將服務器對象的一些附加功能。我最初的簡寫示例實際上確實有效,因爲listen被鏈接到服務器變量的最終返回。有趣的小細微差別。

+0

我剛纔遇到了這個,謝謝... –

+0

很高興幫助!這真是一個很奇怪的問題,我仍然有點迷惑。有誰知道.listen()函數實際返回什麼?我會假定它返回一個對其被調用的http.Server對象的引用(以便於鏈接)。它返回的對象似乎有一些與http.Server對象類似的方法,但不相同。不幸的是,文件沒有說明退貨的性質。 – bigmac