أحصل على 400 مع الرسالة {"code":2,"message":"Bad handshake method"}
عند محاولة توصيل خادمي برأس إضافي (يعمل بشكل جيد إذا لم أحاول إضافته).
أحاول توصيل خادمي بالتكوين التالي:
const options = {
transportOptions: {
polling: {
extraHeaders: {
Authorization: "Bearer test"
}
}
}
};
لقد لاحظت أيضًا أنه يتم إجراء طلب OPTIONS عندما أقوم بإضافة هذا الرأس الإضافي (بدلاً من GET عندما لا أقوم بإضافته)
طلب الحصول على GET (للاحتفاظ بملفات تعريف الارتباط) مع الرؤوس الإضافية التي لا تكسر الاتصال.
نفس المشكلة ، هنا .. تعمل بشكل كامل مع إصدار nodejs من socket.io-client وليس المتصفح
مرحبا! أعتقد أنه يجب عليك إضافة الرؤوس المناسبة على جانب الخادم (يبدو أنك في موقف CORS):
const io = require('socket.io')(3000, {
handlePreflightRequest: function (req, res) {
var headers = {
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Allow-Origin': 'http://localhost:3001',
'Access-Control-Allow-Credentials': true
};
res.writeHead(200, headers);
res.end();
}
});
أضفت مثالاً هناك: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers
darrachequesne كيفية تحديد مجالات متعددة للأصل ، الطرق التالية لا تعمل:
تم تعريف
رؤوس ثابتة = {
"التحكم في الوصول والسماح بالعناوين": "نوع المحتوى ، التخويل" ،
"Access-Control-Allow-Origin": null ،
"التحكم في الوصول والسماح ببيانات الاعتماد": صحيح
} ؛
لاستخدام كورس
{
handlePreflightRequest: function (req، res) {
رؤوس var = {
"التحكم في الوصول والسماح بالعناوين": "نوع المحتوى ، التخويل" ،
"التحكم في الوصول ، السماح بالأصل": req.headers.origin،
"التحكم في الوصول والسماح ببيانات الاعتماد": صحيح
} ؛
res.writeHead (200 ، رؤوس) ؛
إعادة إرسال()؛
}
}
لاستخدام كورس
{
handlePreflightRequest: function (req، res) {
رؤوس var = {
"التحكم في الوصول والسماح بالعناوين": "نوع المحتوى ، التخويل" ،
"التحكم في الوصول ، السماح بالأصل": req.headers.origin،
"التحكم في الوصول والسماح ببيانات الاعتماد": صحيح
} ؛
res.writeHead (200 ، رؤوس) ؛
إعادة إرسال()؛
}
}
"التحكم في الوصول ، السماح بالأصل": req.headers.origin
هذا فقط أنقذ يومي! عندما استخدمت:
"Access-Control-Allow-Origin": "،سيعطيني الخطأ التالي:"يجب ألا تكون قيمة رأس" Access-Control-Allow-Origin "في الاستجابة هي حرف البدل" عندما يكون وضع بيانات اعتماد الطلب "include". يتم التحكم في وضع بيانات الاعتماد للطلبات التي بدأها XMLHttpRequest بواسطة السمة withCredentials . "
يبدو أن هذا لم يعد يعمل مع أحدث socket.io. المطبوع عليه لا يعجبه. على أي حال لإصلاح؟
يبدو أن هذا لم يعد يعمل مع أحدث socket.io. المطبوع عليه لا يعجبه. على أي حال لإصلاح؟
@ supertiger1234 handlePreflightRequest
له واجهة مختلفة في الإصدار الأخير
لذلك في حالتك يجب أن يكون:
...
handlePreflightRequest: function(server, req, res) {
var headers = {
"Access-Control-Allow-Headers": "Content-Type, Authorization",
"Access-Control-Allow-Origin": config.allowedOrigins,
"Access-Control-Allow-Credentials": true,
};
res.writeHead(200, headers);
res.end();
...
لدى @ supertiger1234 handlePreflightRequest واجهة مختلفة في الإصدار الأخير
⚠️ إذا قمت بتثبيت socket.io الآن من npm ، فسيكون لديك إصدار قديم ، ولكن إذا قمت بتثبيت كتابات (عبرtypes) ، فسيكون لها كتابة جديدة! والتي يمكن أن تكون مضللة للغاية.
كيف أقوم بتثبيت أحدث مقبس io؟
للرجوع إليها في المستقبل: تحدث هذه المشكلة أيضًا عند استخدام خادم post-3.0 مع عميل قبل 3.0. قد يكون السبب في ذلك وجود ذاكرة تخزين مؤقت خاطئة تجعل العملاء يستخدمون إصدارًا أقدم من socket.io.js
.
للقراء في المستقبل ، يرجى الاطلاع على:
التعليق الأكثر فائدة
مرحبا! أعتقد أنه يجب عليك إضافة الرؤوس المناسبة على جانب الخادم (يبدو أنك في موقف CORS):
أضفت مثالاً هناك: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers