【问题标题】:Serving the socket.io javascript file to a client via node.js/express通过 node.js/express 将 socket.io javascript 文件提供给客户端
【发布时间】:2012-07-23 01:33:37
【问题描述】:

我正在尝试获取一个使用 socket.io 和 express 的示例客户端连接(具体来说,这个:http://www.catonmat.net/blog/nodejs-modules-socketio/ 以及其他示例中的一些片段https://github.com/LearnBoost/socket.io/blob/master/examples/chat/app.js)。

我已经完成了大部分的设置和工作 - 服务器运行,我可以点击 / 将 index.jade 文件获取到浏览器。但是,一旦发生这种情况,它什么也不做。

服务器:

var io = require('socket.io');
var express = require('express')
, stylus = require('stylus')
, nib = require('nib');

var app = express.createServer()
var io = io.listen(app);

app.configure(function () {
  app.use(stylus.middleware({ src: __dirname + '/public', compile: compile }));
  app.use(express.static(__dirname + '/public'));
  app.set('views', __dirname);
  app.set('view engine', 'jade');

  function compile (str, path) {
    return stylus(str)
      .set('filename', path)
      .use(nib());
  };
});

app.get('/', function (req, res) {
  res.render('index', { layout: false });
});


app.listen(8080);

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

index.jade:

doctype 5
html
  head
    link(href='/stylesheets/style.css', rel='stylesheet')
    script(src='http://code.jquery.com/jquery-1.6.1.min.js')
    script(src='/socket.io/socket.io.js')
    script
      // socket.io specific code
      var socket = io.connect('http://localhost:8080');
      socket.on('connect', function () {
        alert('connected');
      });
      socket.on('news', function (data) {
          console.log(data);
          socket.emit('my other event', { my: 'data' });
        });
  body
    #chat

服务器似乎没有为 /socket.io/socket.io.js 提供服务(http://localhost:8080/socket.io/socket.io.js 产生错误)。我需要做什么才能获得快递服务该文件?我在任何示例中都找不到。

还有什么我做错了吗?

【问题讨论】:

标签: node.js websocket express socket.io


【解决方案1】:

我假设错误是 404 - 您没有设置 ExpressJS 来提供静态文件。当你请求/socket.io/socket.io.js 时,它没有找到路由,也没有提供静态文件,所以它返回了 404。

通常,您需要设置一个用于提供静态文件的文件夹,例如public。在其中放置您的socket.io 文件夹,并在其中放置socket.io.js 文件。然后,您将其添加到您的 app.configure 块中:

app.use(express.static(__dirname + '/public'));

现在 ExpressJS 知道在发出请求时提供 JS 文件。您可以阅读更多关于 ExpressJS 静态配置的信息here

更新:
我的错误 - 我看到您已经设置了静态服务器。您的目录路径是否正确? socket.io 文件夹是否在您的 public 文件夹中?没有看到您的具体错误,很难知道问题可能是什么。

【讨论】:

    【解决方案2】:

    Using Socket.IO 与 Express 3 要求您实例化 http.Server 以将 socket.io 附加到:

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

    这应该适合你。

    【讨论】:

      【解决方案3】:

      一些将 Express 3 与 socket.io 结合使用的升级指南建议将 http.createServer 传递给 socket.io。

      这可行,但它似乎不能正确地为 socket.io 客户端文件提供服务。 经过一些测试,我发现如果你将 app.listen 返回的内容传递给 socket.io,它就可以工作:

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

      部分回复者请注意:这不是文件路径问题。当使用 node + socket.io http server socket.io 自动拦截对 '/socket.io/socket.io.js' 的 get 调用并为您提供客户端文件。它实际上并不存在于 Web 文件结构中。使用 Express 3 时,此功能似乎已损坏。

      【讨论】:

        猜你喜欢
        • 2020-10-14
        • 2016-11-25
        • 2017-11-24
        • 2012-01-17
        • 2012-01-17
        • 2015-07-25
        • 2018-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多