我正在构建一个网络应用,其中视图需要针对数据更改进行更新。为此,我使用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);
});
}());
我在这里做错了什么?如何确保套接字发出消息?希望有人可以帮助我!
提前致谢。
答案 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。
发出此请求的用户的操作顺序如下:
/
网址。正如您在此序列中所看到的,当您致电io.emit()
时,发出请求的浏览器与socket.io无关。基本上,您无法向呈现在呈现它的相同路线中呈现的页面发射。