Socket.io: GenerateId не работает на 3x

Созданный на 23 нояб. 2020  ·  5Комментарии  ·  Источник: socketio/socket.io

Я хочу:

  • [x] сообщить об ошибке
  • [] запросить функцию

Текущее поведение

При установке 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 буквенно-цифровым. Вместо этого я получаю формат идентификатора сокета по умолчанию.

Настраивать

  • ОС: Windows 10, работает на Node.js
  • версия socket.io: 3.0.0 и 3.0.3

Другая информация (например, трассировки стека, связанные проблемы, предложения по исправлению)

Никаких ошибок не выкидывается, просто не задан формат.

question

Все 5 Комментарий

Да, этого и следовало ожидать.

Вот связанная фиксация: 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 - Ой, да, это так. Спасибо.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги