node.js - Socket.io - listen events in separate routes? -


how can listen events in separate routes? this similar trying do. instance:

import koa 'koa' import serve 'koa-static' import router from'koa-router' import views 'koa-views' import socket 'socket.io' import http '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 buggy - when refresh browser 3 times '/test1', io instance repeated, repeated result below:

a user connected - event 1 user connected - event 1 user connected - event 1 

i guess must have missed or doing wrong.

any ideas?

edit: namespace in sockets can used connect different route /. https://socket.io/docs/rooms-and-namespaces/#custom-namespaces

example:

io.of('/chat').on('connection', function(socket){   console.log('someone connected'); }); 

move code out of chat middleware. should execute once. put out side function , 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 different route default, use path config while creating io instance.

example:

const io = new socket(server, { path: '/chat', serveclient: false }); 

more info here: https://socket.io/docs/server-api/#new-server-httpserver-options


Comments

Popular posts from this blog

Is there a better way to structure post methods in Class Based Views -

performance - Why is XCHG reg, reg a 3 micro-op instruction on modern Intel architectures? -

jquery - Responsive Navbar with Sub Navbar -