Socket.io: рдорд┐рдбрд▓рд╡реЗрдпрд░ (.use) рдХрд╕реНрдЯрдо рдиреЗрдорд╕реНрдкреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХрдиреЗрдХреНрдЯ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 11 рдЕрдХреНрддреВре░ 2017  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: socketio/socket.io

рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐:

  • [x] рдмрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ
  • [] рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░

рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдХрд╕реНрдЯрдо рдиреЗрдорд╕реНрдкреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рд░реНрд╡рд░ рдХреЛ 'рдХрдиреЗрдХреНрд╢рди' рдЗрд╡реЗрдВрдЯ рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ 'рдХрдиреЗрдХреНрдЯ' рдЗрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рдХрд╛рдо:

io.use((socket, next) => {
   console.log('middleware running...');
   next();
}).on('connection', socket => {
  console.log('client connected');
});

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛:

// Following works, but client does not receive 'connect' or 'connection':
io.of('/admin').use((socket, next) => {
   console.log('middleware running...');
   next();
}).on('connection', socket => {
  console.log('client connected');
});

Sitenotes

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм: рдЕрдЧрд░ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ-рдиреЗрдорд╕реНрдкреЗрд╕ рднреА рдХрд┐рд╕реА рднреА 'рдХрдиреЗрдХреНрдЯ' рдИрд╡реЗрдВрдЯ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмреАрдЪ рдореЗрдВ / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕реЗ рднреА рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред

io.on('connection', socket => {
  console.log('client connected');
});

io.of('/admin').use((socket, next) => {
   console.log('middleware running...');
   next();
}).on('connection', socket => {
  console.log('client connected');
});

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╛рдо рд╕реНрдерд╛рди рдкрд░ .use((socket, next) => { next(); }) рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ 'рдХрдиреЗрдХреНрдЯ' рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо (рдпрджрд┐ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдЧ рд╣реИ)

рдХреГрдкрдпрд╛ рдКрдкрд░ рджреЗрдЦреЗрдВ

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░

рдХрдиреЗрдХреНрд╢рди рдкрд░, рдЧреНрд░рд╛рд╣рдХ рдХреЛ 'рдХрдиреЗрдХреНрдЯ' рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рд╕реЗрдЯ рдЕрдк

  • OS: macOS рд╕рд┐рдПрд░рд╛ 10.12.6
  • рдмреНрд░рд╛рдЙрдЬрд╝рд░: рдХреНрд░реЛрдо
  • рдиреЛрдб: v8.2.1
  • рдПрдирдкреАрдПрдо: 5.4.2
  • рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рд╕рдВрд╕реНрдХрд░рдг: 2.0.3

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@JanisRubens рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж: +1:, рдореИрдВ рдЕрдВрддрддрдГ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред Https://github.com/socketio/socket.io/pull/3197 рджреНрд╡рд╛рд░рд╛ рдирд┐рд╢реНрдЪрд┐рдд

рд╕рднреА 12 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдирдорд╕реНрддреЗ! рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

io.use((socket, next) => {
   console.log('(default) middleware running...');
   next();
}).on('connection', socket => {
  console.log('(default) client connected');
});

// Following works, but client does not receive 'connect' or 'connection':
io.of('/admin').use((socket, next) => {
   console.log('(admin) middleware running...');
   next();
}).on('connection', socket => {
  console.log('(admin) client connected');
});

// client
const socket = require('socket.io-client')('http://localhost:3000/admin');

socket.on('connect', onConnect);

function onConnect(){
  console.log('connect ' + socket.id);
}

рдЖрдЙрдЯрдкреБрдЯ ( рдлрд╝рд┐рдбрд▓ ):

server listening on port 3000
(default) middleware running...
(default) client connected
(admin) middleware running...
(admin) client connected

рдирд╣реАрдВ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдкреВрд░реНрдг рдХреЛрдб, рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

рд╕рд░реНрд╡рд░:

let express = require('express'),
    app = new express(),
    server = app.listen(3005, 'localhost'),
    io = require('socket.io')(server)
;

io.on('connection', socket => {
  console.log('client connected');
});

io.of('/admin')
  .use((socket, next) => {
    console.log('middleware running...');
    next();
  })
  .on('connection', socket => {
    console.log('admin connected');
  })
;

рдЧреНрд░рд╛рд╣рдХ:

$(function () {
    let socket;

    $('#btn-connect').click(() => {
        console.log('Connecting ...');

        socket = io('http://localhost:3005');

        socket.on('connect', () => {
            console.log(`Connected to ${url} with id: ${socket.id}`);
        });

        socket.on('disconnect', reason => {
            console.log(`Disconnected. Reason: ${reason}`);
        });
    });

    $('#btn-connect-admin').click(() => {
        console.log('Connecting to admin ...');

        socket = io('http://localhost:3005/admin');

        socket.on('connect', () => {
            console.log(`Connected to ${url} with id: ${socket.id}`);
        });

        socket.on('disconnect', reason => {
            console.log(`Disconnected. Reason: ${reason}`);
        });
    });
});

рдпрджрд┐ рдореИрдВ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╣рдЯрд╛рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рджреЛрдиреЛрдВ рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВред рдпрджрд┐ рдореИрдВ рдХреЗрд╡рд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╛рдо рд╕реНрдерд╛рди рдкрд░ рди рддреЛ рдХреЛрдИ рдХрдиреЗрдХреНрдЯ рдИрд╡реЗрдВрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рди рд╣реА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХред

рд╕рд░реНрд╡рд░ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

  • рдЧреНрд░рд╛рд╣рдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ
  • рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ ...
  • рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ

рдХреБрдЫ рднреА рддреЛ рдирд╣реАрдВ? :(

@MickL рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ?
рдПрдХ рд╣реА рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред
рдпрдХреАрди рдирд╣реАрдВ рд╣реЛрддрд╛ рдХрд┐ рдЖрдкрдиреЗ рдпрд╣ рджреЗрдЦрд╛ред рдПрдХрдорд╛рддреНрд░ рдХрдиреЗрдХреНрд╢рди рд╕рдорд╕реНрдпрд╛ рд░реВрдЯ рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЗ рд╕рд╛рде рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк рд░реВрдЯ рдкрде рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрд╕рд╕реЗ рднреА рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред (рдпрд╣ рдПрдХ рддреНрд╡рд░рд┐рдд рдлрд┐рдХреНрд╕ tbh рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдЖрддрд╛ рд╣реИ:

If namespace A('/)' and B('/otherPath') has no middleware it connects to both fine;
If namespace A has no middleware and B has. It connects to A on server side, but client sides 'connect' event listener never gets called, B namespace connects fine;
If namespace A and B both has middleware it can connect to both;

рдирд╣реАрдВ, рдореИрдВрдиреЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдХреЗ рдмрдЬрд╛рдп:

io.of('/admin')
  .use((socket, next) => {
    if(tokenValid()) {
       next();
    } else {
      next(new Error('Authentication error'));
    }
  })
  .on('connection', socket => {
    console.log('admin connected');
  })
;

рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛:

io.of('/admin')
  .on('connection', socket => {
    if(!tokenValid()) {
       socket.disconnect();
    }

    console.log('admin connected');
  })
;

рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдмрд╣реБрдд рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХрдиреЗрдХреНрд╢рди рдЗрд╡реЗрдВрдЯ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЗрдЪреНрдЫрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдареАрдХ рд╕реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@darrachequesne рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдФрд░ рдкрд░рдЦрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд╣реАрдВ рд╣реИред

рдЖрдкрдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╛рдо рд╕реНрдерд╛рди рд╕реЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдРрд╢реЗ рд╣реА:

io.on('connection', socket => {
  console.log('(default) client connected');
});

io.of('/admin').use((socket, next) => {
   console.log('(admin) middleware running...');
   next();
}).on('connection', socket => {
  console.log('(admin) client connected');
});

// client
const socket = require('socket.io-client')('http://localhost:3000/');
const socket_two = require('socket.io-client')('http://localhost:3000/admin');
//wont trigger
socket.on('connect', onConnect);
//will trigger
socket_two.on('connect', onConnect);

function onConnect(){
  console.log('connect ' + socket.id);
}

рдЕрдм рдпрд╣ рдЕрд╕рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдЬрдм рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ / рдКрдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЪреАрдпрд░реНрд╕ред

@JanisRubens рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж: +1:, рдореИрдВ рдЕрдВрддрддрдГ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред Https://github.com/socketio/socket.io/pull/3197 рджреНрд╡рд╛рд░рд╛ рдирд┐рд╢реНрдЪрд┐рдд

рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ!
рдиреЗрдорд╕реНрдкреЗрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдИрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рдиреЗрдорд╕реНрдкреЗрд╕ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреЛрдИ рдИрд╡реЗрдВрдЯ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдлреНрд░реЗрдо рдХреНрд░реЛрдо рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рдереЗред

+1

@adeelhussain @ElioTohm рдЖрдк рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рдлрд┐рдбреЗрд▓ рдХреЗ рд╕рд╛рде рдорд╛рдорд▓реЗ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ?

рд╕реЙрдХреЗрдЯрд┐рдпреЛ v2.1.1 рдФрд░ рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ редio-redis v5.2.0
рдореИрдВ рдЗрд╕реЗ fiddle asap рдХреЗ рд╕рд╛рде рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Elliot9 picture Elliot9  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

doughsay picture doughsay  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

thebinarypenguin picture thebinarypenguin  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dmuth picture dmuth  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MyMomSaysIAmSpecial picture MyMomSaysIAmSpecial  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ