繁体   English   中英

来自HTTP API控制器的Socket.io触发事件

[英]Socket.io trigger event from controller of HTTP API

在我的Node + Express服务器应用程序中,我想从特定控制器发出通知,这些通知由HTTP API发出的请求触发:

例如:

router.route('/status').put(Order.changeStatus)

class Order {
  static changeStatus(req, res) {
    // Modifying database record with changed status
    // Emiting message to specific socket room
  }
}

我正在按以下方式处理套接字连接:

import AuthMiddleware from '../middleware/AuthMiddleware';

const socketio = require('socket.io');
let io;

module.exports.listen = function(app){
  io = socketio.listen(app);

  io.on('connection', function(socket){
    console.log('Client connected');

    AuthMiddleware.authenticateSocket(socket, (err, user) => {
      socket.join(user._id);
      console.log('Client joined to: ' + user._id);
    })

    socket.on('disconnect', () => {
      console.log('Client disconnected')
    });
  });

  return io;
}

在对传入的套接字连接进行身份验证之后,它将订阅到其自己的ID房间。

套接字在项目顶部被初始化,如下所示:

import app from './app';
import http from 'http';


const PORT = process.env.PORT || 7235;
const server = http.createServer(app);

const io = require('./socket/main').listen(server);

// App start
server.listen(PORT, err => {
  console.log(err || `Server listening on port ${PORT}`);
}); 

尽管我能够处理传入事件并对其进行响应,但是这种结构的问题在于,我无法访问控制器中的io对象以能够在特定房间中发出数据,如下所示:

io.sockets.in(userID).emit('notification', data);

能够从HTTP API的控制器触发套接字事件的正确结构是什么?

您的控制器需要有权访问已配置的io对象。 最简单的方法是将其导出到模块中,而不仅仅是导出listen函数,也许像这样:

import AuthMiddleware from '../middleware/AuthMiddleware';

const socketio = require('socket.io');
let io;

function listen(app){
  io = socketio.listen(app);

  io.on('connection', function(socket){
    console.log('Client connected');

    AuthMiddleware.authenticateSocket(socket, (err, user) => {
      socket.join(user._id);
      console.log('Client joined to: ' + user._id);
    })

    socket.on('disconnect', () => {
      console.log('Client disconnected')
    });
  });

  return io;
}

module.exports = {
  listen, io
}

然后您的控制器就可以执行const io = require('./path/to/that').io;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM