如何全局定义套接字变量

时间:2019-04-04 07:19:29

标签: javascript node.js socket.io hapijs

我的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 个答案:

答案 0 :(得分:6)

next回调在这里并不是很好的用途,因为它是同步的。由于socket.io connection事件可以多次触发,因此无法将其转换为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 => {
  ...
});

这种情况也可以受益于可观察到的东西,例如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 :(得分:1)

您可以使用Server methods

在整个服务器实例上共享功能
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;

    }