Saat menyetel io.engine.generateId
di v2.3.0, id soket disetel sesuai.
Dalam 3x (diuji pada 3.0.0 dan 3.0.3) tidak.
Di Node.js:
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const { v4: uuidv4 } = require('uuid');
io.engine.generateId = function (req)
{
return uuidv4();
}
Saat bekerja di v2.3.0, format yang diharapkan dari id soket harus, dalam hal ini, "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", menjadi x alfanumerik. Sebagai gantinya saya mendapatkan format id soket default.
Tidak ada kesalahan yang terjadi, formatnya tidak disetel.
Ya, itu yang diharapkan.
Inilah komit terkait: https://github.com/socketio/socket.io/commit/2875d2cfdfa463e64cb520099749f543bbc4eb15
Jadi, metode generateId
masih berfungsi di v3, tetapi sekarang hanya akan memengaruhi parameter kueri sid
, bukan atribut id
dari soket.
Bolehkah saya bertanya apa kasus penggunaan Anda?
Oh baiklah! Terimakasih atas infonya.
Saya menggunakan kembali id
untuk mengirimkannya ke klien lain untuk panggilan video menggunakan peer.js, tetapi peer.js tidak menyukai formatnya.
Tapi saya baru saja melihat di komit yang Anda sebutkan bahwa saya tidak boleh melakukan ini karena alasan keamanan, jadi saya kira saya bisa menutup masalah ini.
Terima kasih!
Saya pikir masalah ini harus dibuka kembali (atau masalah baru dibuat), seperti pada versi 3.0, tampaknya fungsi generateId tidak pernah dipanggil. Saya mengerti bahwa itu tidak lagi menggantikan properti socket.id, tetapi komentar @darrachequesne sebelumnya menunjukkan bahwa itu mengubah properti yang berbeda.
Namun, sesuai dokumentasi, lakukan hal berikut:
const content = require('fs').readFileSync(__dirname + '/index.html', 'utf8');
const httpServer = require('http').createServer((req, res) => {
// serve the index.html file
res.setHeader('Content-Type', 'text/html');
res.setHeader('Content-Length', Buffer.byteLength(content));
res.end(content);
});
const io = require('socket.io')(httpServer);
io.engine.generateId((req) => {
console.log('This line is never executed');
return new Date().valueOf().toString()
});
io.on('connection', socket => {
console.log('connect');
console.log(socket.sid);
});
httpServer.listen(3000, () => {
console.log('go to http://localhost:3000');
});
Fungsi tidak pernah dipanggil.
@BrianHVB Saya pikir ada kesalahan ketik dalam contoh kode Anda:
io.engine.generateId = ((req) => {
console.log('This line is never executed');
return new Date().valueOf().toString()
});
Bisakah Anda mengonfirmasi bahwa itu memperbaiki masalah?
@darrachequesne - Ups, ya, memang begitu. Terima kasih.