عند تعيين io.engine.generateId
في الإصدار 2.3.0 ، يتم تعيين معرفات المقبس وفقًا لذلك.
في 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();
}
أثناء العمل في الإصدار 2.3.0 ، يجب أن يكون التنسيق المتوقع لمعرفات المقبس ، في هذه الحالة ، "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ، x أبجدي رقمي. بدلاً من ذلك ، أحصل على تنسيق معرف المقبس الافتراضي.
لم يتم طرح أي أخطاء ، لم يتم تعيين التنسيق ببساطة.
نعم ، هذا متوقع.
إليك الالتزام ذي الصلة: https://github.com/socketio/socket.io/commit/2875d2cfdfa463e64cb520099749f543bbc4eb15
لذلك ، لا تزال طريقة generateId
تعمل في الإصدار 3 ، لكنها ستؤثر الآن فقط على معلمة الاستعلام sid
، وليس السمة id
للمقبس.
هل لي أن أسأل ما هي حالة استخدامك؟
حسنا! شكرا للمعلومة.
كنت أعيد استخدام id
لإرساله إلى عملاء آخرين لإجراء مكالمات فيديو باستخدام peer.js ، لكن peer.js لا يحب تنسيقه.
لكنني رأيت للتو في الالتزام أنك ذكرت أنه لا ينبغي أن أفعل ذلك لأسباب أمنية ، لذلك أعتقد أنه يمكنني إغلاق هذه المشكلة.
شكرا!
أعتقد أنه يجب إعادة فتح هذه المشكلة (أو إنشاء إصدار جديد) ، كما هو الحال في الإصدار 3.0 ، لا يبدو أنه يتم استدعاء وظيفة createId على الإطلاق. أفهم أنه لم يعد يحل محل الخاصية 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 - عفوًا ، نعم ، هذا