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
Post a Comment