Express 4 + Socket.io = 404

3
几个小时以来,我一直在尝试让socket.io与express 4配合使用。我开始按照这个教程进行操作:http://cwbuecheler.com/web/tutorials/2014/restful-web-app-node-express-mongodb/,并成功创建了rest api。
为了让socket.io正常工作,我使用了以下命令:
npm install socket.io

这将socket.io添加到我的node_modules目录中。之后,我编辑了我的app.js文件,加入了以下代码:
//LINE above var app = espress();
var http    =     require('http').Server(app);
var io      =     require("socket.io")(http);
io.on('connection',function(socket){  
    console.log("A user is connected");
});
// my routes etc

在我的(jade)视图中,我添加了以下代码:
script(src="https://cdn.socket.io/socket.io-1.2.0.js")
script.
    var socket = io('http://localhost/');

现在当我使用npm start命令时,我在浏览器和npm控制台中看到了以下错误信息:

http://localhost:3000/socket.io/?EIO=3&transport=polling&t=1427056664743-51 404 (not found)

据我所知,与相关问题中几乎每个答案建议使用express-generator不同,我没有使用它,我做错了什么? 这是我的完整app.js 我尝试过这个方法,但结果是一个端口3000已被占用的错误。

说句实话,我不建议从CDN加载Socket.IO客户端。如果你从Socket.IO服务器本身加载,你将得到与服务器匹配的版本。这可能是你在这里遇到问题的根源。 - Brad
@Brad,我已经将它更改为本地源(已经检查并加载),但是仍旧出现相同的错误。 - Sven van den Boogaart
首先,它应该是 require('http').createServer(handler) - Matt Harrison
我认为应该是 http://localhost:3000/socket.io/socket.io.js。参考文献请见这里 - majidarif
1个回答

11

感谢这里的回答,我的问题已解决。

var app = express();
var http = require( "http" ).createServer( app );
var io = require( "socket.io" )( http );
http.listen(8080, "127.0.0.1");


io.on('connection',function(socket){  
    console.log("A user is connected");
});

在客户端:

script(src='/javascripts/socket.io-1.2.0.js')
script.
    var socket = io.connect( "http://localhost:8080");

更改端口号解决了问题(使用8080代替3000)


20
我认为3000端口应该能够使用,你提供的链接解决方法的主要观点似乎是使用app.listen无法工作,因为socket.io只能从http服务器获取请求,而socket.io以服务器作为其处理程序,而不是express应用程序。 - saltthehash
那么客户端代码应该是什么?script.不合适,我似乎无法理解它的意思。 - avisk

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