【问题标题】:socket.io: Failed to load resourcesocket.io:加载资源失败
【发布时间】:2012-07-24 02:11:57
【问题描述】:

我正在尝试开始使用 socket.io 和 node.js。

按照 socket.io 网站上的第一个示例,我在浏览器的控制台中收到以下错误:

Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:3001/socket.io/socket.io.js
Uncaught ReferenceError: io is not defined 

这是我的 server.js

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

app.listen(3001);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

这是我的 index.html

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>
  </body>
</html>

我已经安装了socket.io..

【问题讨论】:

  • 看起来它没有在您的服务器上找到 socket.io.js。它在你定义的路径中吗?
  • 这个文件在请求路径时应该由node自己托管:/socket.io/socket.io.js。
  • 我从未使用过 socket.io.js,但根据您发布的服务器代码,我看不到文件是如何下载的。通常使用 node/express 您可以包含 express.static 以提供该文件或为其定义路由。如果默认情况下提供静态资源,那么我会查看路径。
  • 您使用的是哪个版本的 express?
  • 这实际上不是 socket.io 的问题,'localhost' 的行为很奇怪,有时不喜欢像真正的 url 一样使用节点。

标签: sockets node.js socket.io


【解决方案1】:

以下更改终于对我有用

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

【讨论】:

    【解决方案2】:

    首先,Socket.io "How To Use" 文档含糊不清(可能具有误导性);尤其是在为 Socket.io 客户端编写代码时。

    其次,您在 StackOverflow 上得到的答案太具体了。您不必为 Socket.io 客户端手动硬编码协议、主机名和端口号;这不是一个可扩展的解决方案。 Javascript 可以使用位置对象为您处理这个问题 - window.location.origin。

    Socket.io 入门

    安装

    Socket.io 需要安装服务器和客户端。

    安装服务器
    npm install socket.io

    要使用客户端,请将此脚本添加到您的文档 (index.html)
    &lt;script src="https://cdn.socket.io/socket.io-1.4.5.js"&gt;&lt;/script&gt;

    使用 Express 3/4 实现

    创建以下文件:

    服务器(app.js)

    var app = require('express')();
    var server = require('http').Server(app);
    var io = require('socket.io')(server);
    
    server.listen(80);
    
    app.get('/', function (req, res) {
      res.sendfile(__dirname + '/index.html');
    });
    
    io.on('connection', function (socket) {
      socket.emit('news', { hello: 'world' });
      socket.on('my other event', function (data) {
        console.log(data);
      });
    });
    

    客户端(index.html)

    <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
    <script>
      // origin = http(s)://(hostname):(port)
      // The Socket.io client needs an origin
      // with an http(s) protocol for the initial handshake.
      // Web sockets don't run over the http(s) protocol,
      // so you don't need to provide URL pathnames.
      var origin = window.location.origin;
      var socket = io.connect(origin);
      socket.on('news', function (data) {
        console.log(data);
        socket.emit('my other event', { my: 'data' });
      });
    </script>
    

    【讨论】:

      【解决方案3】:

      试试这个

      var app = express()
      ,http = require('http');
      
      var server = http.createServer(app);
      server.listen(3001);
      io = require('socket.io').listen(server);
      io.set('log level', 1); 
      

      希望对你有帮助

      【讨论】:

        【解决方案4】:

        如果您尝试在另一台计算机上运行它并且遇到此错误,您可能会发现这很有用。

        var host = window.location.hostname; 
        var socket = io.connect('http://' + host);
        

        如果您使用的是 https,那么显然您还需要更改协议。在我的情况下,我需要创建一个可以在多台本地计算机上运行的服务器,因此在这里放置一个固定地址是行不通的,因为套接字需要连接到不同的地址,具体取决于您从哪个服务器加载页面。在此处添加它,因为它也可能对其他人有所帮助。

        【讨论】:

          【解决方案5】:

          我知道这已经很晚了,但我为那些之前可能已经设置 node.js 的人找到了一个解决方案。我的机器需要更换硬件,当它回来时,我注意到很多设置都恢复了出厂默认设置。我也遇到了上面讨论的错误。

          跑步

          sudo apachectl 启动

          从终端解决了我的问题。

          【讨论】:

            【解决方案6】:

            如果您使用的是express 3.x 版,则有Socket.IO compatibility issues that require a bit of fine tuning to migrate:

            Socket.IO 的 .listen() 方法将 http.Server 实例作为参数。
            从 3.x 开始,express() 的返回值不是 http.Server 实例.要让 Socket.IO 与 Express 3.x 一起使用,请确保手动创建 http.Server 实例并将其传递给 Socket.IO 的 .listen() 方法。

            这是一个简单的例子:

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

            【讨论】:

              【解决方案7】:

              问题

              • 首先,您需要在客户端查看服务器绑定的服务器端口 (app.listen(3001);),以便完全访问服务器。

              • 对于socket.io,在link标签的其余源码之前添加http://localhost:3001可以解决这个问题。这显然是由于网络将端口绑定到本地主机的方式,但是我会尝试找到更多有关原因的信息;

              要更改的内容:


              服务器的端口绑定:

              var socket = io.connect('http://localhost');

              应该改成

              var socket = io.connect('http://localhost:3001');



              让 socket.io 正常运行:

              &lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt;

              应该改成

              &lt;script src="http://localhost:3001/socket.io/socket.io.js"&gt;&lt;/script&gt;


              【讨论】:

              • 知道为什么此设置仅适用于一个用户而不适用于其他用户吗?
              猜你喜欢
              • 2016-07-01
              • 1970-01-01
              • 2014-08-21
              • 2020-11-18
              • 2020-07-16
              • 2014-01-21
              • 1970-01-01
              • 2018-01-15
              • 2013-02-26
              相关资源
              最近更新 更多