socket.handshake.query
νμ¬ connect
μ λν λ°μ΄ν° μ€μ μ νμ©νμ§λ§ reconnect
κ° μ€νλκΈ° μ μλ μ°Έμ‘°λ‘ μ
λ°μ΄νΈν μ μμ΅λλ€. μ΄κ²μ μλ‘ κ³ μΉ¨ ν ν°μΌλ‘ μμΌ μ°κ²°μ μΉμΈν λ λ¬Έμ λ₯Ό μΌμΌν΅λλ€.
//client
io.connect("wss://socket.server.com", {
query : {
token:"something dynamic"
}
});
μλ²κ° λ€μ μμλκ³ ν΄λΌμ΄μΈνΈκ° reconnect
μΈ κ²½μ° μμΌμ λ€μ μΈμ¦ν λ ν ν°μ΄ μ€λλμμ μ μμ΅λλ€.
//server
io.use(function(socket, next) {
var query = socket.handshake.query;
if(isValidToken(query.token)){
next();//will never fire if the token has been updated
}
});
쿼리λ₯Ό function
:
io.connect("wss://socket.server.com", {
query : function(){
return {
token:"something dynamic"
}
}
});
νμ¬ μμΌ μμ±μμμ:
if (opts && opts.query) {
this.query = opts.query;
}
λ€μκ³Ό κ°μ΄ λ³κ²½ν μ μμ΅λλ€.
if(opts && opts.query) {
this.query = typeof opts.query == 'function' && opts.query.call(this) || opts.query;
}
+1
λ²κ·Έ #1086μ λν μμ λ λ¬Έμ λ₯Ό ν΄κ²°ν΄μΌ ν©λλ€. μ°κ²°μ μ±κ³΅ν ν 쿼리 μ΅μ
μ λ³κ²½νλ©΄ μ΄μ socket.io-client λ²μ μμ μλνμ§λ§ νμ¬ λ²μ μμλ 쿼리 κ°μ²΄μ λν μ°Έμ‘°κ° μμ€λ©λλ€.
@reeltimedoktor νμ¬ reconnect_attempt
μ΄λ²€νΈμμ query
κ°μ²΄λ₯Ό μ
λ°μ΄νΈν μ μμ΄μΌ ν©λλ€.
socket.on('reconnect_attempt', function () {
socket.io.opts.query = { token: /* ... */ };
});
@darrachequesne μ μ루μ μ΄ λλ₯Ό μν΄ μλνμ§ μλ κ² κ°μ΅λλ€ :(
μ λ socket.io
λ²μ 2.3.0
μ λ
Έλ μλ²μ ν¨κ» ν΄λΌμ΄μΈνΈμ socket.io-client
λ²μ 2.3.0
μ μμ΅λλ€.
ν΄λΌμ΄μΈνΈμμ λλ μ΄κ²μνκ³ μμ΅λλ€ :
socket.on('reconnect_attempt', async () => {
const newToken = await getNewToken();
socket.io.opts.query = {
token: latestToken,
};
});
κ·Έλ° λ€μ μλ²λ io.use()
μ λ¬λ λ―Έλ€μ¨μ΄λ₯Ό μ¬μ©νμ¬ ν ν°μ μΈμ¦ν©λλ€(μμΌμ΄ μ°κ²° λλ μ¬μ°κ²°λ λ μ€νλμ΄μΌ ν©λλ€, afaik?).
νμ¬ μλ² μΈμ¦μ΄ μ¬μ°κ²°μ μ€ν¨νκ³ ν ν°μ΄ λ§λ£λμλ€κ³ ν©λλ€. μ ν ν°μ΄ socket.io.opts.query.token
μ μ λλ‘ ν λΉλμ§ μμ κ² κ°μ΅λλ€. μ΄μ κ° λ¬΄μμ
λκΉ?
κ°μ¬ ν΄μ :)
μ
λ°μ΄νΈ: μμΌ κ°μ²΄μ μΈμ¦ ν ν°μ΄ μ μ₯λ μ¬λ¬ μμΉκ° μλ κ² κ°μ΅λλ€(μ: socket.io.engine.query.token
, socket.io.engine.transport.query.token
. socket.io.opts.query.token
λ₯Ό μ€μ ν λ μλμΌλ‘ μ±μμ§μ§ μμ΅λλ€. κ·Έλ¬λ μ΄κ²μ λ³κ²½ν΄λ μλ²κ° '보λ' λ΄μ©μλ μν₯μ λ―ΈμΉμ§ μμ΅λλ€. μ¬μ ν μ΄μ ν ν°λ§ λ΄
λλ€.
ν ν°μ λν μμΌ κ°μ²΄μ μΌλΆ url νλμ URL 맀κ°λ³μλ‘ ν¬ν¨λ κ²μΌλ‘ 보μ λλ€. μλ§λ μ΄κ²λ€λ μ λ°μ΄νΈλμ΄μΌ ν©λκΉ?
λ μ‘°μ¬ν κ²°κ³Ό ν ν°μ socket.io.opts.query.token
λ‘ μ€μ νλ©΄ λ€μ μ°κ²°ν λ μ¬μΈμ¦μ μν΄ ν ν°μ λ³κ²½νλ λ° μΆ©λΆν κ²μΌλ‘ 보μ
λλ€. λ΄ μ±μ λ€λ₯Έ λ¬Έμ κ° μλ κ² κ°μ΅λλ€. Firebase μΈμ¦ ν ν° μμ±κ³Ό κ΄λ ¨μ΄ μμ μ μμ΅λλ€. λ°λΌμ μ΄κ²μ μ νλ λ€λ₯Έ μ¬λμκ²λ
μ’μ, λ΄κ° κ·Έκ²μ κ³ μ³€λ€κ³ μκ°νλ€ - λΉμ μ 'reconnect_attempt' μ½λ°±μμ λκΈ°μ μΌλ‘ μ ν ν°μ λ°κ³ μλμ§ νμΈν΄μΌ νλ€. μ¦, λ€μκ³Ό κ°μ΄ νμ§ λ§λΌ.
socket.on('reconnect_attempt', async () => {
const newToken = await getNewToken(); // won't work
socket.io.opts.query = {
token: latestToken,
};
});
μ ν ν°μ΄ μ€μ λκΈ° μ μ μλ² μΈ‘ μΈμ¦μ΄ μλ£λ κ² κ°μ΅λλ€. ν ν°μ λκΈ°μμΌλ‘ κ°μ Έμ€λ©΄(μ΄μ μ μΌμ μκ° λμ κ°μ Έμ μ μ₯ν λ€μ μμ κΈ° μ½λ°±μμ κ²μνμ¬) μλ²λ μ¬μ°κ²° μΈμ¦μ μν μκ°μ μ μΈμ¦ ν ν°μ κ°μ Έμ΅λλ€.
"socket.io-client": "3.0.4"
μ ν¨κ» TS2341: Property 'opts' is private and only accessible within class 'Manager'.
μ€λ₯κ° λ°μν©λλ€. "typescript": "4.1.3"
μ’μ, λ΄κ° κ·Έκ²μ κ³ μ³€λ€κ³ μκ°νλ€ - λΉμ μ λΉμ μ΄ 'reconnect_attempt' μ½λ°±μμ _λκΈ°μ μΌλ‘_ μλ‘μ΄ ν ν°μ λ°κ³ μλμ§ νμΈν΄μΌ νλ€. μ¦, μ΄κ²μ νμ§ λ§λΌ:
socket.on('reconnect_attempt', async () => { const newToken = await getNewToken(); // won't work socket.io.opts.query = { token: latestToken, }; });
μ ν ν°μ΄ μ€μ λκΈ° μ μ μλ² μΈ‘ μΈμ¦μ΄ μλ£λ κ² κ°μ΅λλ€. ν ν°μ λκΈ°μμΌλ‘ κ°μ Έμ€λ©΄(μ΄μ μ μΌμ μκ° λμ κ°μ Έμ μ μ₯ν λ€μ μμ κΈ° μ½λ°±μμ κ²μνμ¬) μλ²λ μ¬μ°κ²° μΈμ¦μ μν μκ°μ μ μΈμ¦ ν ν°μ κ°μ Έμ΅λλ€.
λΉμ·ν λ¬Έμ κ° μμ΅λλ€. κ·Έλ¬λ νμ¬ ν΄κ²° λ°©λ²μ μΈμ¦μ΄ μ€ν¨ν λ μλ² μΈ‘μμ disconnect
μ
λλ€. ν΄λΌμ΄μΈνΈμμ disconnect
μ΄λ²€νΈλ₯Ό μμ νλ©΄ λΉλκΈ° μ½μ νΈμΆλ‘ 쿼리/ν€λλ₯Ό μ¬κ΅¬μ±ν©λλ€. reconnecting
μ΄λ²€νΈμ λλ¬νμ λ μ΄λ―Έ 쿼리/ν€λμ μ κ°μ΄ μμ΅λλ€.
λ―Έλμ λ μλ₯Ό μν΄:
Socket.IO v2μμ query
μ΅μ
μ λμμ λ€μ λ κ°μ§ λͺ¨λμμ μ¬μ©λκΈ° λλ¬Έμ μ½κ° μ΄μν©λλ€.
κ·Έλμ μ΄μ λ²μ κ³Ό νΈνλλ λ°©μμΌλ‘ μ΄λ»κ² κ³ μΉ μ μλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€...
μ΄μ auth
μ΅μ
μ μ¬μ©ν μ μμΌλ―λ‘ Socket.IO v3μμ μμ λμμ΅λλ€.
// plain object
const socket = io({
auth: {
token: "abc"
}
});
// or with a function
const socket = io({
auth: (cb) => {
cb({
token: "abc"
});
}
});
async
ν¨μμμλ μλν΄μΌ ν©λλ€.
const socket = io({
auth: async (cb) => {
cb({
token: "abc"
});
}
});
λν보μμμ€:
κ°μ₯ μ μ©ν λκΈ
@reeltimedoktor νμ¬
reconnect_attempt
μ΄λ²€νΈμμquery
κ°μ²΄λ₯Ό μ λ°μ΄νΈν μ μμ΄μΌ ν©λλ€.