node.js - socket.io - 无法让它工作,在某种轮询调用中有 404

标签 node.js express socket.io pug

我正在尝试使用 socket.io 设置服务器,但结果很糟糕。

我主要遵循本指南,尽管它有些过时: http://www.williammora.com/2013/03/nodejs-tutorial-building-chatroom-with.html

socket.io 出现问题,我不确定是客户端还是服务器端。它似乎在尝试不断地轮询服务器,但正在返回 404。听起来 socket.io 没有运行,但对我来说一切正常。它也可能与路径和“公共(public)”目录有关,但我真的不知道。

127.0.0.1 - - [Thu, 17 Jul 2014 00:51:36 GMT] "GET /socket.io/?EIO=2&transport=polling&t=1405558296120-0 HTTP/1.1" 404 73 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.76.4 (KHTML, like Gecko) Version/7.0.4 Safari/537.76.4"
127.0.0.1 - - [Thu, 17 Jul 2014 00:51:37 GMT] "GET /socket.io/?EIO=2&transport=polling&t=1405558297181-1 HTTP/1.1" 404 73 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.76.4 (KHTML, like Gecko) Version/7.0.4 Safari/537.76.4"
127.0.0.1 - - [Thu, 17 Jul 2014 00:51:39 GMT] "GET /socket.io/?EIO=2&transport=polling&t=1405558299207-2 HTTP/1.1" 404 73 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.76.4 (KHTML, like Gecko) Version/7.0.4 Safari/537.76.4"

服务器

var exec = require( "child_process" ).exec;
var path = require( "path" );
var morgan = require( "morgan" );
var bodyParser = require( "body-parser" );
var _ = require( "underscore" );
var express = require( "express" );
var app = express();
var http = require( "http" ).createServer( app );
var io = require( "socket.io" )( http );

app.set( "ipaddr", "127.0.0.1" );
app.set( "port", 8080 );

//support JSON, urlencoded, and multipart requests
app.use( bodyParser() );

//log the requests using morgan
app.use( morgan() );

//specify the Jade views folder
app.set( "views", __dirname + "/../views" );

//set the view engine to Jade
app.set( "view engine", "jade" );

//specify static content
app.use( express[ "static" ]( "public", __dirname + "/../public" ) ); //using map-access of static so jslint won't bitch

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

客户

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

我的客户端 js 文件来自: node_modules/socket.io/node_modules/socket.io-client/socket.io.js

该路径与我正在使用的教程所说的或 socket.io 所说的不匹配,所以也许这就是问题所在,但看起来它可能是正确的文件。

这里有什么帮助吗?

编辑 有关其他信息,这是我的文件夹层次结构:

Webserver/
    my_modules/
        server.js
    node_modules/
        body-parser/
        express/
        jade/
        morgan/
        socket.io/
        underscore/
    public/
        css/
        js/
            server.js
    views/
        index.jade
    index.js
    package.json

my_modules 文件夹中的 server.js 是我在服务器端启动 socket.io 的地方。 js文件夹中的server.js是从网站连接的客户端代码。

最佳答案

看起来 Socket.IO 无法拦截以 /socket.io/ 开头的请求。这是因为在您的情况下,监听器是 app - Express 处理程序。您必须让 http 成为监听器,这样 Socket.IO 才能访问请求处理。

尝试替换

app.set( "ipaddr", "127.0.0.1" );
app.set( "port", 8080 );

http.listen(8080, "127.0.0.1");

详情请参阅文档:http://socket.io/docs/#using-with-express-3/4

关于node.js - socket.io - 无法让它工作,在某种轮询调用中有 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24793255/

相关文章:

javascript - WebStorm能否将参数的子属性解析为函数

javascript - 使用pdfkit生成pdf文件并发送到nodejs-expressjs中的浏览器

javascript - Node 服务器未收到将 src 文件更改为 img 元素的请求

node.js - heroku 上的 socket.io 请求 404

node.js - socket.io-client 无法连接

node.js - 将node.js multipart/form-data 中的文件上传到api

node.js - 你如何为 node.js 实现 AWS Elasticache 自动发现

node.js - Passport : Unknown authentication strategy "local"

javascript - 如何使用 node.js req.pipe(res) 将视频响应发送到 html 播放器

javascript - 在azure上部署node.js + socket.io后端/服务器