При установке io.engine.generateId
в v2.3.0 идентификаторы сокетов устанавливаются соответственно.
В 3х (проверено на 3.0.0 и 3.0.3) их нет.
В 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();
}
При работе в v2.3.0 ожидаемый формат идентификаторов сокетов в этом случае должен быть «xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx», то есть x буквенно-цифровым. Вместо этого я получаю формат идентификатора сокета по умолчанию.
Никаких ошибок не выкидывается, просто не задан формат.
Да, этого и следовало ожидать.
Вот связанная фиксация: https://github.com/socketio/socket.io/commit/2875d2cfdfa463e64cb520099749f543bbc4eb15
Итак, метод generateId
все еще работает в v3, но теперь он будет влиять только на параметр запроса sid
, а не на атрибут id
сокета.
Могу я спросить, каков ваш вариант использования?
Ох, ладно! Спасибо за информацию.
Я повторно использовал id
для передачи его другим клиентам для видеозвонков с использованием peer.js, но peer.js не нравится его формат.
Но я только что увидел в коммите, о котором вы упомянули, что мне не следует этого делать по соображениям безопасности, поэтому я думаю, что могу закрыть эту проблему.
Спасибо!
Я думаю, что эту проблему следует повторно открыть (или создать новую проблему), так как в версии 3.0 не похоже, что функция generateId когда-либо вызывалась. Я понимаю, что он больше не заменяет свойство socket.id, но предыдущий комментарий @darrachequesne предполагает, что он меняет другое свойство.
Однако, согласно документации, выполните следующие действия:
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');
});
Функция никогда не вызывается.
@BrianHVB Я думаю, что в вашем примере кода есть опечатка:
io.engine.generateId = ((req) => {
console.log('This line is never executed');
return new Date().valueOf().toString()
});
Не могли бы вы подтвердить, что это решает проблему?
@darrachequesne - Ой, да, это так. Спасибо.