gpt4 book ai didi

javascript - 套接字不在路由内发出

转载 作者:行者123 更新时间:2023-12-03 03:22:36 25 4
gpt4 key购买 nike

我正在构建一个网络应用程序,其中的 View 需要根据数据更改进行更新。为此,我使用了 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')
});
});

当我查看控制台时,我一进入页面,它就会记录“新连接”。现在我想在我所做的其中一条 route 使用套接字。为了实现这一点,我将 io 绑定(bind)到我需要路线的地方,如下所示:

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. 浏览器请求 /网址。
  3. 服务器调用该 URL 的路由处理程序。
  4. 您的路线处理程序调用 io.emit()它发送到所有当前连接的客户端,但发出此请求的客户端当前未连接。
  5. 路由处理程序呈现页面并将其发送回浏览器。
  6. 浏览器接收并呈现页面
  7. 浏览器在页面中运行 Javascript,从而建立 socket.io 连接。

从这个序列中可以看出,当您调用io.emit()时,发出请求的浏览器并未与socket.io连接。 。基本上,您不能向正在渲染的页面发出与渲染它相同的路由。

关于javascript - 套接字不在路由内发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46502641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com