首页 > 解决方案 > 如何全局定义套接字变量

问题描述

我的文件中有这段代码,在socketio这里我可以socket简单地使用。

import _ from 'lodash'
import mongoose from 'mongoose'

exports.register = (server, options, next) => {
  var io = require('socket.io')(server.listener)
  io.on('connection', async(socket) => {
    // here I can use socket.emit() and all
  })
  next()
}

exports.register.attributes = {
  name: 'socket'
}

现在,我需要使用io套接字来处理emit来自各种文件的事件,并且不想io.on('connection', async(socket) => {})每次都连接它。

我怎样才能做到这一点?

谢谢!!!

标签: javascriptnode.jssocket.iohapijs

解决方案


next回调在这里没有很好的用途,因为它是同步的。由于 socket.ioconnection事件可以多次触发,因此无法将其转换为更容易链接的 Promise,因此最好保持基于回调的方式。

有可能:

var socketIo = require('socket.io')

exports.register = (server, options) => {
  var io = socketIo(server.listener);

  return onConnect => {
    io.on('connection', onConnect);
  };
}

所以连接函数被创建一次:

const myConnection = register(myServer);

并通过应用程序使用:

myConnection(client => {
  ...
});

这种情况也可以从 observables 中受益,例如 RxJS。

如果套接字不支持重新连接,这可以简化为:

exports.register = (server, options) => {
  var io = socketIo(server.listener);

  return new Promise(resolve => {        
    io.once('connection', resolve);
  });
}

连接承诺创建一次:

所以连接函数被创建一次:

const myConnection = register(myServer);

并通过应用程序使用:

const client = await myConnection;
...

推荐阅读