我的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) => {})
。
我该怎么做?
谢谢!
答案 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;
}