【问题标题】:How to listen to an event after emitting an event Socket.io如何在发出事件 Socket.io 后监听事件
【发布时间】:2021-04-16 04:03:28
【问题描述】:

我想在我的 nodejs 服务器上构建一个 SQL 处理程序服务器端。

我希望我的 nodejs 接收来自客户端的请求 - 例如:

client.js

socket.emit("sql-query", "SELECT * FROM *");
socket.on('sql-response', results => {
    do things with results...
}

server.js

socket.on('sql-query', query => {
    connection.query(query, function(error, results, fields)) {
        if(results > 0) socket.emit('sql-response', results);
        else console.log('No results... yet !');
    }
});

问题是,如果我这样做,每个需要发出 SQL 请求的函数都会获得 sql-response 事件。

我希望我的 emit 返回结果而不必捕获另一个事件(每个使用 SQL 请求的文件都会捕获)。

类似这样的: server.js

socket.on('sql-query', query => {
    connection.query(query, function(error, results, fields)) {
        if(results > 0) socket.return(results); //I know this is wrong and that's not how events work.
    }
});

总体思路:使用 nodejs / socket.io 服务器从其他文件发出 SQL 请求。

请告诉我这样做是否令人头疼,以及是否有另一种更好的方法来实现这一点。

谢谢

【问题讨论】:

  • 请告诉我这是否令人头疼,不是真的,但 SQL 注入会伤害更多。您可以使用确认回调,即socket.emit(eventName[, …args][, ack]);dupe/examples 不需要socket.on('sql-response'
  • 该死的谢谢你。这正是我所需要的,client.emit('ferret', 'tobu', (response) => { console.log(response) console.log('ack') });不知道您可以等待发射本身的响应。再次感谢您
  • np,不要忘记在调用之前检查它的函数,即if (typeof ack === 'function') ack(result),链接中的欺骗答案不会解决它,如果它不是函数并调用它会使服务器崩溃

标签: javascript node.js websocket socket.io


【解决方案1】:

我不太确定如果我得到了你,但对我来说,它可以按你的意愿工作,但它与你使用的代码相同,因为 socket.emit 不会多播

服务器

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

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', (socket) => {
  socket.on('sql-query', (query) => {
    socket.emit('sql-response', `this is your response: ${query}`);
  });
});

server.listen(3000, () => {
  console.log('listening on *:3000');
});

客户

<!DOCTYPE html>
<html>
  <head>
    <title>Socket.IO chat</title>
    <style>
      body { margin: 0; padding-bottom: 3rem; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; }

      #form { background: rgba(0, 0, 0, 0.15); padding: 0.25rem; position: fixed; bottom: 0; left: 0; right: 0; display: flex; height: 3rem; box-sizing: border-box; backdrop-filter: blur(10px); }
      #input { border: none; padding: 0 1rem; flex-grow: 1; border-radius: 2rem; margin: 0.25rem; }
      #input:focus { outline: none; }
      #form > button { background: #333; border: none; padding: 0 1rem; margin: 0.25rem; border-radius: 3px; outline: none; color: #fff; }

      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages > li { padding: 0.5rem 1rem; }
      #messages > li:nth-child(odd) { background: #efefef; }
    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
  </head>
  <body>
    <ul id="messages"></ul>
    <form id="form" action="">
      <input id="input" autocomplete="off" /><button>Send</button>
    </form>
  </body>
  <script>
    var socket = io();
    var form = document.getElementById('form');
    var input = document.getElementById('input');

    form.addEventListener('submit', function(e) {
      e.preventDefault();
      if (input.value) {
        console.log(input.value)
        socket.emit('sql-query', input.value);
        input.value = '';
      }
    });

    socket.on('sql-response', function(msg) {
      var item = document.createElement('li');
      item.textContent = msg;
      messages.appendChild(item);
      window.scrollTo(0, document.body.scrollHeight);
    });
  </script>
</html>

【讨论】:

  • 很抱歉我写得这么糟糕。即使我自己重读了一遍,我也无法理解。想象一下我有两个功能。登录,它使用 SELECT SQL 查询签入表。还有一个寄存器,其中包括一个 INSERT SQL 查询。我有两个页面,登录和注册。两者都发出不同的 SQL 查询。但两者都抓住了“sql-response”事件。我怎样才能使它只有发射功能收到 sql-response ?
  • 没问题,我创建了一个例子here,这个例子有两个视图loginregister,都包含相同的代码,但是在在这个例子中,你可以看到登录视图收到了它发送的信息,并且以同样的方式注册视图,如果我没有收到你,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2018-06-28
  • 2019-02-07
相关资源
最近更新 更多