为什么我的快递服务器上出现'无法获取/'?

时间:2013-01-14 21:48:15

标签: node.js express socket.io

我写了一个带有node.js的服务器的简约示例,我想要获得客户端连接的控制台通知。我正在使用以下版本的模块

  • express@3.0.6
  • socket.io@0.9.13
  • node@0.8.7

所以我写了这个:

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

1 个答案:

答案 0 :(得分:9)

你的专栏:

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

应替换为

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

通过执行此操作,您将直接通过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文件。为不支持Websockets的浏览器提供的swf)

您可以从ExpressJS APISocket.io wiki了解更多信息。