ค่าที่ซ้ำกันเมื่อใช้ express และ socket.io ใน nodeJS

ฉันมีแอปพลิเคชัน nodeJS โดยใช้ express และ socket.io ฉันต้องการแยกโค้ดบางส่วนเพื่อให้ทำงานได้ในหน้าเดียวที่ฉันให้บริการเท่านั้น เมื่อต้องการทำสิ่งนี้ ฉันได้ใช้ express เพื่อฟังคำขอและป้อนหน้า html เป็นการตอบกลับ

app.get('/archive', function(request, response) {
    response.sendfile(__dirname + "/views/table.html");
}

ฉันยังมีฟังก์ชัน socket.io ที่รับฟังและส่งข้อมูลไปยังหน้า html

io.sockets.on('connection', function(socket) {
     channel.subscribe('cheat', function(message) {
      socket.emit('message', message);
});\

ทุกอย่างทำงานได้ดีเมื่อโค้ดเป็นเช่นนี้ แต่ทันทีที่ฉันลองใส่ฟังก์ชัน socket.on ลงในฟังก์ชัน app.get ฉันมีปัญหา คำขอแรกทำงานได้อย่างสมบูรณ์ แต่เมื่อรีเฟรชเพจ ข้อมูลทั้งหมดก็จะถูกทำซ้ำ ครั้งแรกมันคือ x2 แล้วก็ x3 แล้วก็ x4 ไปเรื่อยๆ ไม่มีใครรู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้น?

นี่คือลักษณะของโค้ดสุดท้ายของฉัน:

app.get('/archive', function(request, response) {
    response.sendfile(__dirname + "/views/table.html");
    io.sockets.on('connection', function(socket) {
        channel.subscribe('cheat', function(message) {
        socket.emit('message', message);
    });
}

person vcazan    schedule 31.10.2013    source แหล่งที่มา


คำตอบ (2)


คุณไม่ควรใส่ Listener การเชื่อมต่อ Socket.IO ไว้ในเส้นทาง HTTP เหตุการณ์ connection สำหรับออบเจ็กต์ Socket.IO จะถูกเรียกในแต่ละครั้งที่มีการเชื่อมต่อ ดังนั้น หากคุณสร้าง Listener การเชื่อมต่อใหม่ในแต่ละครั้งที่เรียกใช้เส้นทาง HTTP คุณจะมี Listener ซ้ำ ซึ่งจะเริ่มทำงานทั้งหมดเมื่อมีการเชื่อมต่อ

หากคุณไม่ต้องการให้ Socket.IO อยู่ในหน้าใดหน้าหนึ่ง ก็อย่ารวมสคริปต์ไคลเอนต์ไว้ในหน้านั้น มิฉะนั้น วิธีอื่นในการทำเช่นนี้คือการจัดเก็บเส้นทางไคลเอ็นต์ไว้ในคุกกี้ และเข้าถึงคุกกี้นั้นในระหว่างการอนุญาต จากนั้นคุณสามารถยอมรับหรือปฏิเสธลูกค้าได้

person hexacyanide    schedule 31.10.2013
comment
เมื่อฉันใช้ socket.handshake.url ฉันได้รับ URL ที่ไม่ซ้ำกัน (/socket.io/1/?t=128438943) ไม่ใช่ /path - person vcazan; 01.11.2013
comment
ขออภัย ดูเหมือนว่าจะไม่ถูกต้อง ฉันได้แก้ไขคำตอบแล้ว - person hexacyanide; 03.11.2013

ฉันใช้ฟังก์ชัน url.parse เพื่อรับชื่อของเพจดังนี้:

var curURL = url.parse(request.url).pathname;

จากนั้นฉันก็สามารถตรวจสอบ URL ปัจจุบันได้

 if (curURL == '/') {
    //code
}

สำหรับปัญหาค่าที่ซ้ำกัน ฉันลืมยกเลิกการสมัครเมื่อออก หลังจากสมัครสมาชิกยกเลิกการสมัคร (); มันใช้งานได้ทั้งหมด

person vcazan    schedule 04.11.2013