[英]Socket.io - listen events in separate routes?
How can I listen events in separate routes? 如何在单独的路线中监听事件? This is similar to what I am trying to do.
这类似于我正在尝试做的事情。 For instance:
例如:
import Koa from 'koa'
import serve from 'koa-static'
import Router from'koa-router'
import views from 'koa-views'
import socket from 'socket.io'
import http from 'http'
import config from'./config'
const app = new Koa()
const router = new Router()
const server = http.createServer(app.callback())
const io = new socket(server)
app.use(async function (ctx, next) {
ctx.io = io
await next()
})
const test1 = async(ctx, next) => {
ctx.io.on('connection', (socket) => {
console.log('a user connected - event 1')
socket.on('disconnect', () => {
console.log('user disconnected')
})
socket.on('Event1', (data) => {
console.log('Event1')
})
})
await ctx.render('test1', {});
}
const test2 = async(ctx, next) => {
ctx.io.on('connection', (socket) => {
console.log('a user connected - event 2')
socket.on('disconnect', () => {
console.log('user disconnected')
})
socket.on('Event2', (data) => {
console.log('Event2')
})
})
await ctx.render('test2', {});
}
router
.get('/', function (ctx, next) {
ctx.body = 'Hello World!';
})
.get('/test1', test1)
.get('/test2', test2)
app.use(serve(config.static_dir.root))
app.use(views(__dirname + config.template.path, config.template.options))
app
.use(router.routes())
.use(router.allowedMethods())
server.listen(config.server.port)
They works ok but buggy - when you refresh browser 3 times for '/test1'
, io instance will be repeated , so I will get repeated result below: 它们可以正常工作,但存在错误-当您为
'/test1'
刷新浏览器3次时,io实例将被重复 ,因此我将在下面得到重复的结果:
a user connected - event 1
a user connected - event 1
a user connected - event 1
I guess I must have missed something or doing it wrong. 我想我一定错过了某件事或做错了。
Any ideas? 有任何想法吗?
Edit: Namespace in sockets can be used to connect to a different route than /
. 编辑:套接字中的命名空间可用于连接到不同于
/
路由。 https://socket.io/docs/rooms-and-namespaces/#custom-namespaces https://socket.io/docs/rooms-and-namespaces/#custom-namespaces
Example: 例:
io.of('/chat').on('connection', function(socket){
console.log('someone connected');
});
Move this code out of the chat middleware. 将此代码移出聊天中间件。 It should execute only once.
它应该只执行一次。 Just put it out side the function and it should work.
只需将其放在函数旁边,它应该可以工作。
io.on('connection', (socket) => {
console.log('a user connected')
socket.on('disconnect', () => {
console.log('user disconnected')
})
socket.on('chat.message', (msg) => {
console.log('message: ' + msg)
io.emit('chat.message', msg)
})
});
To make socket file serve on a different route than default, use path
config while creating the io instance. 要使套接字文件在不同于默认
path
在创建io实例时使用path
config。
Example: 例:
const io = new socket(server, { path: '/chat', serveClient: false });
more info here: https://socket.io/docs/server-api/#new-server-httpserver-options 此处提供更多信息: https : //socket.io/docs/server-api/#new-server-httpserver-options
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.