socket.io.js未找到。

45
由于某些原因,我的Node服务器无法提供路由/socket.io/socket.io.js,我总是得到404错误。
我尝试编译不同的Node版本(当前版本为0.6.13,也在服务器上运行,在那里它实际上可以正常工作)。
从app.js中,我得到info: socket.io started,并且在尝试调用socket.io.js时没有错误。
我尝试从localhost和端口8000以及使用express框架进行访问。
这是app.js的代码:
var express = require('express')
  , app = require('express').createServer()
  , io = require('socket.io').listen(app, { log: true });

app.listen(8000);

app.configure(function() {
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

io.sockets.on('connection', function (socket) {
   // all other stuff here

1
展示你的代码(如果你使用框架,请展示socket.io初始化和框架初始化)。 - freakish
6个回答

95

请检查您的Express版本。Express最近已更新到3.0alpha,其API已更改。如果是3.0版本,您可以将代码更改为以下内容:

var express = require('express')
  , http = require('http');

var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);

...

server.listen(8000);

使用connect时遇到了同样的问题:https://github.com/senchalabs/connect/issues/500#issuecomment-4620773


好的,听起来非常接近了。我用你的代码替换了它,现在当我尝试启动服务器时,出现了以下错误:Cannot call method 'on' of undefined。这对应于以下代码片段:io.sockets.on('connection', function (socket) {。这太奇怪了,我感到很迷茫。 - dan-lee
15
将来参考时,请不要忘记在使用示例代码片段时将 app.listen() 更改为 server.listen() - Diogo Gomes
我尝试了大约15到20个非常相似的代码变体。这是对我有效的那一个。谢谢! - pedalpete
1
这对我非常有用。非常感谢! - mineroot
这个解决方案也适用于Docker。请查看此链接以获取实时示例。 - user7503126
显示剩余3条评论

4

使用 Express 3 web 框架:(从 socket.io 来)

> Express 3 要求您首先实例化一个 http.Server,然后再将 socket.io 附加到它上面:

意思是 - (1)您必须创建一个服务器实例:

var app = express();
var http = require('http').createServer(app);

(2)将其与socket.io配对:

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

然后才是 - (3) 让服务器监听:

http.listen(8080);

确保您保持此顺序!


1
安装了Node 0.8.1之后,我遇到了同样的问题。 我只是在项目文件夹中删除了node_modules映射,并重新安装了express/socket.io。 之后,你提出的代码又可以正常工作了。

0

默认端口3000对我来说不起作用,即使它没有被使用。它会在/socket.io/socket.io.js处失败并显示404错误(没有其他通知或解释)。尝试使用您确定未被使用的不同端口,这可能适用于您。


0
也许这可以帮助你,在我的Ubuntu 11.10上,我没有正确设置NODE_PATH变量, 如果你在Linux/Mac上,请尝试将下面的行添加到你的.bashrc/.zshrc文件中。
export NODE_PATH=/usr/lib/node_modules:$NODE_PATH

1
我将node_modules添加到了我的NODE_PATH中,但它仍然无法正常工作。太糟糕了,这真的让我充满希望。但奇怪的是,当通过npm安装某些内容时,它会显示:检查node路径:未找到。但是当执行echo $NODE_PATH命令时,我得到了/usr/local/lib/node:/usr/local/lib/node_modules的结果。我现在真的感到很困惑。 - dan-lee

0

在你的代码库中安装 Socket.io:

npm install socket.io --save 

在配置完服务器之后:

   var express = require('express')
   var app     = express();
   var server  = require('http').createServer(app);
   var io      = require('socket.io').listen(server);

   server.listen(app.get('80')); // not 'app.listen'

在你的档案中 HTML/EJS 或者其他你想要的地方,添加以下代码:

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

检查是否适用于控制台(Chrome / Mozilla等)。

在我的示例中,我使用Chrome(Ctrl + shift + I):

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接