Socket.IO ไม่อัปเกรดการเชื่อมต่อกับ websockets

ฉันกำลังทำโปรเจ็กต์กับ Angular และ Node.js ซึ่งฉันใช้ socket.io (v3.1.0) ปัญหาคือการเชื่อมต่อระหว่างเซิร์ฟเวอร์และไคลเอ็นต์ไม่เคยอัปเกรดจาก การสำรวจ เป็น websockets แม้ว่าฉันจะเห็นบนเว็บคอนโซลว่ามีการส่งคำขออัปเกรดการเชื่อมต่อและ ได้รับการตอบกลับด้วยรหัส 101 พร้อมโปรโตคอลสลับ

นี่คือรหัสกำหนดค่า socket.io บนเซิร์ฟเวอร์:


const app = express();
const server = await app.listen(port);

const test = io.of('/api/test');
test.on('connect', socket => {
  console.log("Connected");
});


io.listen(server, 
      {
      cors: { 
         origin: "*", 
         methods: ["GET", "POST"],
         allowedHeaders: ["content-type"],
         credentials: true
      }
   });

รหัสลูกค้า:

this.socket = io("/api/test")
this.socket.on('connect', () => {
      console.log("Connected");
});

ไฟล์กำหนดค่าพร็อกซี:

"/sock/*": {
        "target": "http://localhost:3000/socket.io/",
        "logLevel": "debug"
    }

อีกสิ่งหนึ่งที่ฉันต้องการเพิ่มคือถ้าฉันเปลี่ยนไฟล์พรอกซีเป็น:

"/sock/*": {
        "target": "http://localhost:3000/socket.io/",
        "logLevel": "debug",
        "ws": true
    }

ตอนนี้ใน Chrome ใช้งานได้กับ ws เท่านั้น (ตามที่คาดไว้) แต่ใช้ไม่ได้กับ mozilla (มันรีเฟรชหน้าและเกิดข้อผิดพลาด)

ดังนั้นคำถามคือ: มีใครรู้บ้างว่าทำไมมันถึงไม่อัพเกรดเป็น websockets โดยอัตโนมัติ? จากสิ่งที่ฉันเข้าใจ ควรส่งคำขอ http ก่อนสำหรับการจับมือกัน แต่หลังจากนั้นควรอัปเกรดเป็น websockets ตามค่าเริ่มต้น ฉันผิดหรือเปล่า?


person Juen    schedule 02.02.2021    source แหล่งที่มา


คำตอบ (1)


ฉันมีปัญหาเดียวกันกับ Firefox หากฉันตั้งค่าสคริปต์เพื่อรับบันเดิลจากเซิร์ฟเวอร์ socket.io จะส่งสคริปต์เป็น text/html ซึ่งบังคับให้ Firefox ไม่โหลดเนื่องจากส่วนหัว X-Content-Type-Options: nosniff และถ้าฉันโหลดสคริปต์โดยตรง มันจะรวมกลุ่มกันอย่างต่อเนื่องโดยไม่มีโอกาสในการอัปเกรด

person korrona    schedule 23.02.2021
comment
แก้ไขภายหลัง: ใช้งานได้แล้ว คุณต้องเปลี่ยนลำดับการขนส่ง: socket = io({ query: { ['_csrf']: csrfToken }, transports: [ "websocket", "polling" ] }); - person korrona; 23.02.2021
comment
ฉันลืมไป คุณต้องตั้งค่าสคริปต์จาก dir แบบคงที่หรือจาก cdn การพยายามโหลดเป็นบันเดิลจากเซิร์ฟเวอร์ จะทำให้ Firefox bezerk มีอาการไม่พึงประสงค์ - person korrona; 23.02.2021
comment
โอ้ ขอบคุณสำหรับคำตอบ ฉันเพิ่งเห็นมัน!! :) - person Juen; 24.03.2021