【问题标题】:How do I prevent socket.io from emitting events sequentially/automatically?如何防止 socket.io 顺序/自动发出事件?
【发布时间】:2017-11-02 07:02:54
【问题描述】:

我刚开始在我的 node.js-server 上使用 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" );
        })
})

非常感谢您的时间和努力。

【问题讨论】:

  • 看起来您正在向服务器执行 POST 请求。删除 'var jqxhr = ...' 行,它应该可以按预期工作。
  • 页面加载时不再发出事件。但是每当我单击按钮并等待两分钟时,服务器就会再次发出事件。

标签: javascript jquery node.js sockets


【解决方案1】:

问题是由两件事造成的:

  1. 你在页面加载时发出请求:

    var jqxhr = $.post('/event', function () {

  2. 如果请求失败或不返回,某些浏览器(包括 Chrome)可能会每两分钟重试一次请求。确保服务器中没有断点,并且服务器发送代码为 200 的响应。

【讨论】:

    【解决方案2】:

    您的端点不会向客户端返回任何内容。在这种情况下,某些浏览器会重试请求。

    确保在事件发出后返回一些结果给客户端,例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多