更改应用程序URL后无法获取socket.io

时间:2019-02-28 00:16:49

标签: javascript node.js express socket.io

这里有很多与此主题相关的问题,大多数问题都无关紧要,因为我使用的是express 4.16.4和socket.io 2.2.0。 其次,因为我的示例已经可以在localhost和远程主机上使用。

在我的远程托管服务器上,我可以通过提供三个选项来创建一个nodejs应用程序:

  • 应用程序根
  • 应用程序网址
  • 应用程序启动文件

我的准系统示例应用程序安装在/test中,请参见文件结构:

/test
  /node_modules
    /lots of folders
  index.html
  index.js
  package.json
/domains/
  /mydomain.com
    /public_html
      index.html

当我转到mydomain.com并且控制台使用以下参数打印tx received!时,一切正常:

  • 应用程序根= 'test'
  • 应用程序URL = ''
  • 应用程序启动文件= 'index.js'

现在,我希望可以在mydomain.com/test上访问该应用程序。 但是,当我将应用程序URL从''更改为'test'时,io是未定义的,因为我无法获取文件/socket.io/socket.io.js。 我仍然得到express提供的索引文件,因为我也进行了更改 app.get("/",app.get("/test",

index.js:

var express = require('express');
var app     = express();
var server  = app.listen(8000);
var socketIO = require('socket.io');
var io = socketIO(server);

app.get("/test", function(req, res) {
  res.sendFile( __dirname + "/index.html" );
});

io.on('connection', function(socket){
  socket.emit('tx');
});

index.html:

<!doctype html>
<html>
  <head>
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io.connect();
      socket.on('tx', function () {
        console.log('tx received!');
      });
    </script>
  </head>
  <body>
    TEST
  </body>
</html>

有了Express,当请求__dirname时,我可以成功地使用app.use()在/test中提供静态文件。

问题是socket.io做了一些魔术来建立连接,我不知道socket.io是否等效于app.use

对于Tnx的长期阅读和任何帮助,我们将不胜感激!

1 个答案:

答案 0 :(得分:0)

您可以使用 socket.use()来注册中间件,该中间件是针对每个接收到的Packet都执行的功能。 例如

io.on('connection', (socket) => {
  socket.use((packet, next) => {
    if (packet.doge === true) return next();
    next(new Error('Not a doge error'));
  });
});

对于这个特定问题,您只需将socketio导入代码和其他代码导入到一个单独的js文件中,该文件就会导出io对象,以便您可以通过导入来引用要链接到的每个html文件中的代码。脚本。