如何在套接字函数之外使用(socket.io)发射函数-nodejs,express

Posted

技术标签:

【中文标题】如何在套接字函数之外使用(socket.io)发射函数-nodejs,express【英文标题】:How to use (socket.io)emit function outside of socket function - nodejs,express 【发布时间】:2018-01-08 04:24:08 【问题描述】:

我有以下代码

var app = require('express')();
var http = require('http');
var server = http.createServer();
var socket = require('socket.io');
var io = socket.listen( server );

io.sockets.on('connection', function(socket) 
  console.log('socket connected');
  socket.broadcast.emit('newUser', 'New User Joined, Say Hi :D');

  socket.on('serverEmit',function(msg) 
    console.log('works');
  );

  socket.on('chatMessage', function(msg) 
    io.emit('server_emit', msg);
    console.log(msg);
  );
);

server.listen(3500, function() 
  console.log('listening on *:3500');
);

所以我的问题是如何在这个套接字连接之外添加一个发射函数。例如,如果我有如下的获取请求

app.get('/link',function(req,res) 
  io.sockets.emit('trigger','triggered'); // Process I want to make
);

提前致谢。

【问题讨论】:

关注链接以获得更好的socket.io实践Link 关注链接以获得更好的socket.io实践Link 关注链接以获得更好的socket.io实践Link 【参考方案1】:

你差点就吃完了:

io.emit('trigger','triggered');

如果你需要发射到命名空间,你可以这样做:

const namespace = io.of("name_of_your_namespace");
namespace.emit('trigger','triggered');

【讨论】:

【参考方案2】:

您需要先导出您的 io,以便它可以重复使用。

socket-setup.js

const socket = require("socket.io")

let _io;

const setIO = (server) => 
    _io = socket(server, 
        cors : 
          origin : "*",
          headers : 
            "Access-Control-Allow-Origin" : "*"
          
        
      )
      return _io


const getIO = () => 
    return _io


module.exports = 
    getIO,
    setIO

然后在您的应用入口文件 (index.js) 中,设置您的 io。

const app = express()
const server = http.createServer(app)

let io = setIO(server)
io.on("connection", socket => 
 //Your job
)

然后在任何地方,例如message.js 你想发出事件。你可以像这样使用io。

const onMessageRecieved = () => 
    try 
        getIO().emit("hello", "Bye")
     catch (error) 
        console.log(error);
    

就是这样。享受吧。

【讨论】:

是否可以将io.on("connection", socket => //Your job ) 放在app.js 之外 - 如果是这样,那之后您将如何将其“包含”在app.js 中?我正在进行重构并尝试尽可能多地清理app.js,我有一个更多上下文的问题here。 这是公认的答案吗?

以上是关于如何在套接字函数之外使用(socket.io)发射函数-nodejs,express的主要内容,如果未能解决你的问题,请参考以下文章

覆盖socket.io的发射和开启?

套接字 io 不向房间发送消息

在 NestJs 中使用 Socket IO 加入和发射到房间

Android socket.IO中的Emit或Ack超时处理?

socket.io和express服务器没有从客户端接收发射

世博会套接字发射不工作,但正在工作