рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдХрд╕реНрдЯрдо рдиреЗрдорд╕реНрдкреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рд░реНрд╡рд░ рдХреЛ 'рдХрдиреЗрдХреНрд╢рди' рдЗрд╡реЗрдВрдЯ рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ 'рдХрдиреЗрдХреНрдЯ' рдЗрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдХрд╛рдо:
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');
});
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм: рдЕрдЧрд░ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ-рдиреЗрдорд╕реНрдкреЗрд╕ рднреА рдХрд┐рд╕реА рднреА 'рдХрдиреЗрдХреНрдЯ' рдИрд╡реЗрдВрдЯ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмреАрдЪ рдореЗрдВ / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕реЗ рднреА рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред
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(); })
рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ 'рдХрдиреЗрдХреНрдЯ' рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдХреГрдкрдпрд╛ рдКрдкрд░ рджреЗрдЦреЗрдВ
рдХрдиреЗрдХреНрд╢рди рдкрд░, рдЧреНрд░рд╛рд╣рдХ рдХреЛ 'рдХрдиреЗрдХреНрдЯ' рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдирдорд╕реНрддреЗ! рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
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 рдХреЗ рд╕рд╛рде рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@JanisRubens рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж: +1:, рдореИрдВ рдЕрдВрддрддрдГ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред Https://github.com/socketio/socket.io/pull/3197 рджреНрд╡рд╛рд░рд╛ рдирд┐рд╢реНрдЪрд┐рдд