2017-06-01 72 views
0

我剛開始在我的node.js-server上使用socket.io。每當我通過點擊一個按鈕向服務器發送一個請求時,我只想發出一個事件。問題是,當我加載頁面時,事件已經被髮射,然後每隔兩分鐘再發射一次。爲什麼會發生這種情況,我該如何防止這種情況?我只想讓事件在點擊按鈕後觸發一次。如何防止socket.io按順序/自動發送事件?

server.js

const express = require('express') 
const app = express() 
const server = require('http').createServer(app) 
const io = require('socket.io')(server) 

app.post('/event', function (req, res, next) { 
    console.log('emit event') 
    io.emit('event') 
}) 

app.use(express.static(__dirname + '/public')) 

server.listen(8085) 

的index.html

<html> 
    <body> 
     <div class="container"> 
     </div> 
     <button type="submit" id="fire">Fire!</button> 
     <script src="/socket.io/socket.io.js"></script> 
     <script src="jquery-3.2.1.js"></script> 
     <script src="index.js"></script> 
    </body> 
</html> 

index.js

$('#fire').on('click', function() { 
    console.log('fire!') 
    $.ajax({ 
    url: '/event', 
    method: 'POST' 
    }).done(function (data) { 
    console.log('done') 
    alert(data) 
    }).fail(function (data) { 
    console.log('fail') 
    alert(data) 
    }) 
}) 

$(function() { 
    var socket = io.connect('http://localhost:8085') 
    var container = $('.container') 

    socket.on('event', function (bcevent) { 
    console.log('got event') 
    var newItem = '<p>EVENT</p>' 
    container.append(newItem) 
    }) 

    var jqxhr = $.post('/event', function() { 
     // alert("success"); 
    }) 
     .done(function() { 
      // alert("second success"); 
     }) 
     .fail(function() { 
      // alert("error"); 
     }) 
     .always(function() { 
      // alert("finished"); 
     }) 
}) 

非常感謝你爲你的時間和精力。

+0

看起來你正在執行一個POST請求到服務器。刪除'var jqxhr = ...'行,它應該按預期工作。 – n32303

+0

該事件不會在頁面加載時發出。但是每當我點擊按鈕並等待兩分鐘,服務器就會再次發出事件。 –

回答

1

的問題是兩件事情的結果:

  1. 你掙錢的時候,頁面加載的請求:

    VAR jqxhr = $。員額( '/事件',函數(){

  2. 一些瀏覽器(包括Chrome),如果它失敗或不返回可能重試請求每隔兩分鐘。確保有服務器沒有斷點和服務器發送與碼的響應200

1

您的端點不會將任何內容返回給客戶端。在這種情況下,某些瀏覽器正在重試請求。

確保一些結果返回給客戶端發出的事件之後,例如:

app.post('/event', function (req, res, next) { 
    console.log('emit event'); 
    io.emit('event'); 
    res.status(200).send(); 
});