插座不会在路线内发射

时间:2017-09-30 12:20:26

标签: javascript node.js sockets socket.io emit

我正在构建一个网络应用,其中视图需要针对数据更改进行更新。为此,我使用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')
  });
});

查看我的控制台时,它会记录新的连接'我一到页面就看到了。现在我想在我已经制作的其中一条路线中使用套接字。为了实现这一点,我将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);
  });

}());

我在这里做错了什么?如何确保套接字发出消息?希望有人可以帮助我!

提前致谢。

1 个答案:

答案 0 :(得分:1)

这条路线:

  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. 浏览器请求/网址。
  3. 服务器调用该URL的路由处理程序。
  4. 您的路由处理程序调用{​​{1}},它发送给所有当前连接的客户端,但发出此请求的客户端当前未连接。
  5. 路由处理程序呈现页面并将其发送回浏览器。
  6. 浏览器接收并呈现页面
  7. 浏览器在页面中运行Javascript,导致建立socket.io连接。
  8. 正如您在此序列中所看到的,当您致电io.emit()时,发出请求的浏览器与socket.io无关。基本上,您无法向呈现在呈现它的相同路线中呈现的页面发射。