套接字不会在路由内发出

Socket doesn't emit within route

我正在构建一个网络应用程序,其中的视图需要根据数据更改进行更新。为此,我使用 socket.io。这是 server.js 文件中的设置:

const io = require('socket.io')(http);

/* WEB SOCKET INITIALISATION
----------------------------------------- */
io.on('connection', function(socket) {
  io.emit('new connection', 'new connection');

  socket.on('disconnect', function () {
    io.emit('offline', 'offline')
  });
});

查看我的控制台时,它会在我进入页面时立即记录 'new connection'。现在我想在我制作的其中一条路线中使用套接字。为了使这成为可能,我将 io 绑定到我需要路线的地方,如下所示:

const dashboardRouter = require('./routes/dashboard')(io);

这是部分路线的样子:

/* MAKE SOCKET.IO ACCESSABLE
--------------------------------------------------------------- */
module.exports = function(io) {

  /* INDEX ROUTE
  -------------------------------------------------------------- */
  router.get('/', account.checkSession, playwalls.statistics, playwalls.getYours, function(req, res, next) {
    io.emit('update', 'testen');
    res.locals.username = req.session.username;
    res.render('dashboard/index');
  });

  /* EXPORT ROUTER
  --------------------------------------------------------------- */
  return router;

}

问题是当我发出更新时,它没有登录控制台。当我在路线内执行 console.log(io) 时,看起来 socket.io 是可用的。我在终端控制台内没有收到任何错误。

这是客户端 JavaScript 文件的样子:

(function() {

  const socket = io();

  socket.on('update', function(data) {
    console.log('Works');
  });

  socket.on('new connection', function(data) {
    console.log(data);
  });

}());

我在这里做错了什么?我怎样才能确保套接字发出消息?希望有人能帮我解决这个问题!

提前致谢。

这条路线:

  router.get('/', account.checkSession, playwalls.statistics, playwalls.getYours, function(req, res, next) {
    io.emit('update', 'testen');
    res.locals.username = req.session.username;
    res.render('dashboard/index');
  });

将广播到所有其他连接的页面,但不会为触发此路由的特定用户显示任何内容。那是因为触发此路由的用户正在请求和加载页面并且他们尚未连接到 socket.io.

发出此请求的用户的操作顺序如下:

  1. 浏览器关闭之前的网页,包括断开连接 socket.io 和关闭 Javascript。
  2. 浏览器请求 / URL.
  3. 服务器为此 URL 调用您的路由处理程序。
  4. 您的路由处理程序调用 io.emit() 发送到所有当前连接的客户端,但发出此请求的客户端当前未连接。
  5. 路由处理程序呈现页面并将其发送回浏览器。
  6. 浏览器接收并呈现页面
  7. 浏览器在页面中运行 Javascript,导致建立 socket.io 连接。

从这个序列可以看出,当你调用io.emit()时,发出请求的浏览器并没有连接到socket.io。基本上,您不能在呈现它的同一路径中向正在呈现的页面发出信号。