Socket.io: GenerateIdが3xで機能しない

作成日 2020年11月23日  ·  5コメント  ·  ソース: socketio/socket.io

したい:

  • [x]バグを報告する
  • []機能をリクエストする

現在の動作

v2.3.0でio.engine.generateIdを設定すると、それに応じてソケットIDが設定されます。
3x(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で機能するように、ソケットIDの予想される形式は、この場合、「xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx」であり、x英数字である必要があります。 代わりに、デフォルトのソケットID形式を取得します。

セットアップ

  • OS:Node.jsで実行されているWindows 10
  • socket.ioバージョン:3.0.0および3.0.3

その他の情報(例:スタックトレース、関連する問題、修正方法の提案)

エラーはスローされず、フォーマットは単に設定されていません。

question

全てのコメント5件

はい、それは予想されます。

関連するコミットは次のとおりです: https

したがって、 generateIdメソッドはv3でも引き続き機能しますが、ソケットのid属性ではなく、 sidクエリパラメーターにのみ影響するようになりました。

あなたのユースケースは何ですか?

ああ、大丈夫! 情報をありがとう。

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 評価