- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下设置(重要部分仅为简洁起见):
app.js
...
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
server.listen(port, function() {
console.log(`Server is listening on port: ${port}`);
});
io.on('connection', function (socket) {
console.log('connection');
});
const routes = require('./routes/index')(io, passport);
app.use('/', routes);
index.js(服务器)
router.get('/game/:id', isAuthenticated, (req, res) => {
if (req.id)
{
var game = Game.findOne({_id: req.id}, (err, obj) => {
io.on('getGameInfo', (socket) => {
io.emit('gameInfo', obj);
});
res.render('game', obj);
});
}
else
{
// Id not valid, do something
}
});
客户:
const socket = io('http://localhost:3000');
socket.on('gameInfo', function(data) {
console.log(data);
}.bind(this));
socket.on('connect', () => {
socket.emit('getGameInfo');
});
所以基本上,一旦我知道客户端已连接,并且 getGameInfo 监听器已在游戏路由中设置,我想发出 getGameInfo 调用。但是当我从客户端发出 getGameInfo 时,服务器回调没有被命中。我不确定我是否遗漏了一些明显的东西,或者这是否是一个关闭问题,或者我是否只是度过了那些日子,或者我是否以完全错误的方式处理这件事。
最佳答案
这里存在多个问题。我将首先展示在服务器上监听传入的 socket.io 消息的正确方法:
io.on('connection', function (socket) {
// here's where you have a new socket and you can listen for messages
// on that socket
console.log('connection');
socket.on('gameInfo', (data) => {
socket.emit('gameInfo', obj);
});
});
一些问题:
在服务器上,您通过socket
监听消息。对象,而不是通过io
目的。因此,您通常会在 io.on('connection', ...)
中添加这些事件监听器。处理程序,因为这是您首先看到新连接的套接字的地方。
您几乎不想在 Express 路由处理程序中添加事件监听器,因为它会被调用很多次。此外,在调用路由处理程序时,浏览器尚未接收页面,也不会连接,因此即使这是一个可以做事情的地方,页面也还没有连接。
当您只想将消息发送回一个连接时,可以使用 socket.emit()
发送该消息。 ,不是io.emit()
。 io.emit()
向所有连接的客户端广播,我认为这不是您想要的。
我建议您不要为客户端和服务器重载相同的消息名称来表示两个不同的事物,因为这可能会在阅读代码或在客户端和服务器之间共享某些代码时导致困惑。您的客户端实际上正在发送一条“getGameInfo”消息,然后您的服务器响应一条包含 gameInfo 的“gameInfo”消息。
如果在路由处理程序中,您想要 .emit()
从该页面的套接字(看起来您正在尝试执行此操作),那么您必须做一些工作来在当前页面的 session 和该页面的套接字之间创建链接。有多种方法可以做到这一点。如果您使用任何 session 中间件,则可以记录 socket
在套接字连接点的 session 中。然后,从您的快速路由中,您可以随时从 session 对象获取该套接字。
关于javascript - 为什么在快速路由内没有触发 socket.io 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40565144/
我正在使用 Gunicorn 为 Django 应用程序提供服务,它工作正常,直到我将其超时时间从 30 秒更改为 900000 秒,我不得不这样做,因为我有一个用例需要上传和处理一个巨大的文件(过程
我有一个带有非常基本的管道的Jenkinsfile,它可以旋转docker容器: pipeline { agent { dockerfile { args '-u root' } } stag
在学习 MEAN 堆栈的过程中,我遇到了一个问题。每当我尝试使用 Passport 验证方法时,它都不会返回任何响应。我总是收到“localhost没有发送任何数据。ERR_EMPTY_RESPONS
在当今的大多数企业堆栈中,数据库是我们存储所有秘密的地方。它是安全屋,是待命室,也是用于存储可能非常私密或极具价值的物品的集散地。对于依赖它的数据库管理员、程序员和DevOps团队来说,保护它免受所
是否可以创建像图片上那样的边框?只需使用 css 边框属性。最终结果将是没 Angular 盒子。我不想添加额外的 html 元素。我只想为每个 li 元素添加 css 边框信息。 假设这是一个 ul
我是一名优秀的程序员,十分优秀!