当前位置: 首页 > 知识库问答 >
问题:

如何全局定义套接字变量

郗浩言
2023-03-14

我的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'
}

现在,我需要使用iosocket从各种文件发出emit事件,而不想连接此io.on('connection',async(socket))=

我该怎么做?

谢谢你!!!


共有2个答案

卜和悌
2023-03-14

可以使用Server方法跨服务器实例共享功能

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;

    }
李宜然
2023-03-14

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

这种情况也可以受益于观察,例如。RxJS.

如果插座不支持重新连接,可以简化为:

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

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

连接promise创建一次:

所以连接函数创建一次:

const myConnection = register(myServer);

并通过应用程序使用:

const client = await myConnection;
...
 类似资料:
  • 问题内容: 在Coffeescript.org上: 将编译为: 通过在node.js下的coffee-script进行编译可以做到: 文件说: 如果要创建供其他脚本使用的顶级变量,请将它们作为属性附加到窗口或CommonJS中的exports对象上。如果您同时针对CommonJS和浏览器,那么存在运算符(见下文)为您提供了一种可靠的方法来确定将它们添加到何处:root = exports?这个 然

  • 我用global.d.ts定义全局变量: 但是在执行main.ts的时候 报错:

  • 问题内容: 是否可以使用webpack定义全局变量以产生如下所示的结果: 我看到的所有示例都使用外部文件 问题答案: 有几种方法可以处理全局变量: 1)将变量放入模块中。 Webpack仅对模块进行一次评估,因此您的实例保持全局状态,并在模块之间进行更改。 因此,如果您创建像a之类的东西并导出所有全局变量的对象,则可以读取/写入这些全局变量。您可以导入一个模块,从功能中对对象进行更改,然后导入另一

  • 我想在调用这个函数的时候 初始化一次这个参数全局变量 后续辉修改这个参数的值 我这样写 报错了 请问如何修改呢?

  • 问题内容: 在以下片段中 内部是一个新变量, 外部 将保持为空。 通过显式定义短变量定义并将其替换为赋值,似乎可以正确地初始化外部变量 有没有一种更简单的方法来指定内部变量,而不是实际上是作用域变量,而是全局变量?我在想类似的东西,但这在包本身内部无效。 问题答案: 不,就是这样。只是 New()( https://golang.org/doc/effective_go.html#allocati

  • 本文向大家介绍PHP 用户定义的全局变量,包括了PHP 用户定义的全局变量的使用技巧和注意事项,需要的朋友参考一下 示例 任何函数或类之外的范围都是全局范围。当PHP脚本包含另一个脚本(使用include或require)时,范围保持不变。如果脚本包含在任何函数或类的外部,则其全局变量包含在同一全局范围内,但是如果脚本包含在函数内部,则所包含脚本中的变量位于函数的范围内。 在函数或类方法的范围内,