【问题标题】:socket.io fails to emit in express app.post callbacksocket.io 无法在 express app.post 回调中发出
【发布时间】:2016-10-18 15:44:53
【问题描述】:

我有一个 express 应用程序,它打开了与我的前端 React 应用程序的套接字连接。

每当有人使用 json 数据向我的服务器发送 post 请求但 socket.emit 不会在 a.post 回调中触发时,我想向连接的套接字发出一个事件。 io.sockets.emit 但是工作正常,但在这种情况下对我没有用。

这失败了:

io.on('connection', (socket) => {
    app.post('/event', (req, res) => {
        socket.emit('someevent', req.body);
        res.sendStatus(200);
    }
}

但这通过了:

io.on('connection', (socket) => {
    app.post('/event', (req, res) => {
        io.sockets.emit('someevent', req.body);
        res.sendStatus(200);
    }
}

【问题讨论】:

  • 您正在为每个套接字连接添加一个单独的后处理程序(具有相同的 URL)。只有一个路由处理程序可以运行。这不是你想做的。

标签: javascript node.js express socket.io


【解决方案1】:

SLaks 的评论是正确的,但它并没有帮助我解决我的问题。

我最终做的是:

  1. 在来自客户端的/event 的post 请求中,我添加了一个隐藏的输入字段,其中包含套接字连接的ID。
  2. 然后在我的/event 路由处理程序中,我做了:

    app.post('/event', function(req, res) {
      io.sockets.in(req.body.socketId).emit('someevent', req.body);
      res.sendStatus(200);
    });
    

这是可行的,因为默认情况下,每个套接字连接都会加入一个由其套接字 ID 标识的房间,并且可以使用 io 对象本身将消息发送到房间(无需从 io.on('connection', socket =>{}) 获取套接字对象

【讨论】:

    猜你喜欢
    • 2015-09-07
    • 2016-12-28
    • 2016-04-08
    • 2016-09-30
    • 2017-06-26
    • 1970-01-01
    • 2016-03-24
    • 2019-09-21
    • 2013-12-18
    相关资源
    最近更新 更多