ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½ Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΎΠ±ΡΡΠΈΠ΅ Β«ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅Β», Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΎΠ±ΡΡΠΈΠ΅ Β«ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅Β».
ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ:
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');
});
Π’Π°ΠΊΠΆΠ΅ ΠΎΡΠ΅Π½Ρ ΡΡΡΠ°Π½Π½ΠΎ: Π΅ΡΠ»ΠΈ Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄, ΡΠΎΠ³Π΄Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΠ΅Π½ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅ ΠΠ ΠΈΠ· / admin Π½Π΅ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ.
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(); })
Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΠ΅Π½ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠΎ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ / admin Π½Π΅ Π²ΡΠ΄Π°Π΅Ρ Β«ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡΒ».
Π‘ΠΌ. ΠΡΡΠ΅
ΠΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡΡΠΈΡΡ Β«ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡΒ»
ΠΡΠΈΠ²Π΅Ρ! ΠΠ°ΠΊ Π²Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°? ΠΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
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}`);
});
});
});
ΠΡΠ»ΠΈ Ρ ΡΠ΄Π°Π»Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅ ΠΠ, Ρ ΠΌΠΎΠ³Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ ΠΎΠ±ΠΎΠΈΠΌ. ΠΡΠ»ΠΈ Ρ Π΄ΠΎΠ±Π°Π²Π»Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅ ΠΠ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°, Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΡ ΡΠΎΠ±ΡΡΠΈΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½ΠΈ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΈΠΌΠ΅Π½ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π½ΠΈ Π² / admin.
Π‘Π΅ΡΠ²Π΅Ρ Π²ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ:
ΠΠΈΡΠ΅Π³ΠΎ? :(
@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
Π― Π²ΡΠ΅ Π΅ΡΠ΅ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ ΡΡΠΈΠΌ!
ΠΠ΅ΡΠ΅Π΄ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΎΠ±ΡΡΠΈΡ, Π½ΠΎ ΠΏΠΎΡΠ»Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
ΡΠΎΠ±ΡΡΠΈΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΊΠ°Π΄ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π»ΠΈΡΡ Π½Π° Chrome.
+1
@adeelhussain @ElioTohm ΠΊΠ°ΠΊΡΡ Π²Π΅ΡΡΠΈΡ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅? ΠΠΎΠΆΠ΅ΡΠ΅ Π»ΠΈ Π²Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΡΠΊΡΠΈΠΏΠΊΠ΅ ?
Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ socketio v2.1.1 ΠΈ socket.io-redis v5.2.0
Ρ ΠΏΠΎΡΡΠ°ΡΠ°ΡΡΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π΅Π³ΠΎ Π½Π° ΡΠΊΡΠΈΠΏΠΊΠ΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΡΠ΅Π΅
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
@JanisRubens Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΉ ΠΎΡΡΠ΅Ρ: +1:, Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ² ΠΌΠ½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ. ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ https://github.com/socketio/socket.io/pull/3197