Как определить переменную сокета глобально - PullRequest
7 голосов
/ 04 апреля 2019

У меня есть этот фрагмент кода в моем файле 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) => {}).

Как я могу это сделать?

Спасибо !!!

Ответы [ 2 ]

6 голосов
/ 05 апреля 2019

next обратный вызов здесь не служит хорошей цели, потому что он синхронный.Так как событие socket.io connection может запускаться несколько раз, его нельзя преобразовать в обещание для упрощения создания цепочки, поэтому для него лучше оставаться основанным на обратном вызове.

Это может быть:

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 => {
  ...
});

В этой ситуации также могут быть полезны наблюдаемые, например, 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;
...
1 голос
/ 12 апреля 2019

Вы можете поделиться функциональностью на экземпляре вашего сервера с помощью Методы сервера

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
  })
  // here use server methods
  server.decorate('server', 'io', io);
  next()
}

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

Тогда в вашем контроллере

handler: function (request, reply) {
        const io = request.server.io;

    }
...