当前位置: 首页 > 知识库问答 >
问题:

多个侦听器

杜阳炎
2023-03-14

服务器部件:

const express = require("express");
const app = express();
const cors = require("cors");
const { UserModel } = require("./models");

app.use(cors());

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.options("http://localhost:3000", cors());
const mongoose = require("mongoose");
require("dotenv").config();

const http = require("http").createServer(app);
const io = require("socket.io")(http, {
  cors: {
    origin: ["http://localhost:3002"],
  },
});

http.listen(3001, function () {
  console.log("Server is running");
});

io.on("connection", (socket) => {
  console.log("Socket connected", socket.id);

  socket.on("message:send", (data) => {
    console.log("Пришло в socket.onMessage", data);
    socket.emit("message:fromServer", data);
    // socket.removeListener("message:fromServer");
  });
});

const { userApi } = require("./api/userApi");
app.use("/", userApi);

app.use((err, _, res, __) => {
  return res.status(500).json({
    status: "fail",
    code: 500,
    message: err.message,
  });
});

const { PORT, DB_HOST } = process.env;

const dbConnection = mongoose.connect(DB_HOST, {
  useNewUrlParser: true,
  useFindAndModify: false,
  useCreateIndex: true,
  useUnifiedTopology: true,
});

dbConnection
  .then(() => {
    console.log("DB connect");
    app.listen(PORT || 3000, () => {
      console.log("server running");
    });
  })
  .catch((err) => {
    console.log(err);
  });

客户部分:io.js

import { io } from "socket.io-client";

export const socket = io("http://localhost:3001/");

消息组件

import React from "react";
import { useState } from "react";
// import { useSelector } from "react-redux";
// import { getMessages } from "../../Redux/selectors";
import { socket } from "../helpers/io";
import Message from "../Message/Message";
import { nanoid } from "nanoid";

export default function MessageFlow() {
  const [message, setMessage] = useState([]);

  socket.on("message:fromServer", (data) => {
    console.log("На фронт пришло сообщение: ", data);
    setMessage([...message, data]);
    // setMessage((message) => [...message, data]);
    console.log("Массив сообщений компонента MessageFlow", message);
    console.log(socket.io.engine.transports);
    // socket.off();
    // getEventListeners(socket)['testComplete'][0].remove()
    // socket.removeListener("message:fromServer");
  });

  //   const dispatch = useDispatch();
  // const allMessages = useSelector(getMessages);
  return (
    <div id="mainDiv">
      {message &&
        message.map((i) => {
          // return <Message />;
          return <Message content={i.userId} id={nanoid()} />;
        })}
    </div>
  );
}

信息形式——发布过程的开始

import React, { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { sendMessage } from "../../Redux/Chat/Chat-operations";
import { getUser } from "../../Redux/selectors";
import { getToken } from "../../Redux/Auth/Auth-selectors";
import { socket } from "../helpers/io";
import { useEffect } from "react";
import styles from "./MessageForm.module.css";

export default function MessageForm() {
  const [message, setMessage] = useState("");
  const dispatch = useDispatch();
  const userId = useSelector(getUser);
  const currentToken = useSelector(getToken);
  // const getAll = useSelector(allContacts);

  const updateMessage = (evt) => {
    setMessage(evt.target.value);
  };

  const handleSubmit = (e) => {
    e.preventDefault();
    if (message) {
      socket.emit("message:send", { userId: message });
      dispatch(
        sendMessage(
          {
            _id: userId,
            text: message,
          },
          currentToken
        )
      );
    } else {
      alert(`Молчать будем?`);
    }
  };
  return (
    <div className={styles.messageInputContainer}>
      <form>
        <input
          type="text"
          value={message}
          onChange={updateMessage}
          required
          className={styles.messageInput}
          placeholder="Type message to send"
        />
        <button
          type="submit"
          className={styles.messageAddBtn}
          onClick={handleSubmit}
        >
          Send
        </button>
      </form>
    </div>
  );
}

共有1个答案

百里骏
2023-03-14

您在每次渲染时添加一个侦听器,您应该使用效果钩子

export default function MessageFlow() {

  useEffect(()=>{ // triggered on component mount or when dependency array change
      const callback = (data) => {
        // what you want to do
      }
      socket.on("message:fromServer", callback);
      return () => { // on unmount, clean your listeners
        socket.removeListener('message:fromServer', callback);
      }
  }, []) // dependency array : list variables used in your listener
  // [...]
}
 类似资料:
  • 我是JComboBox的新手 我有4个JComboBox:专用、etudiant、annee和semestre。 每次更改所选项目并将结果添加到滚动窗格(groupe des matieres ouvertes)时,我都需要从其中的4个项目中获取所选项目

  • 我想知道如何在一个键事件中按下所有的键。例如,我想为Ctrl+F编写一个监听器,它可以切换全屏。如何检查在一个事件中是否同时按下了Ctrl和F?

  • 在这篇文章中,加里·拉塞尔解释了如何通过编程创建多个Kafka列斯汀来聆听多个主题。。Kafka·斯普林:如何动态或在循环中创建监听器? 现在我想有一个类似的设置也适用于JMSListeners-在那里我可以有一个带有一个@JMSListener的类,并且我可以以编程方式创建该JMSListener的多个实例,每个实例都注入了自己的queueName。 我发现这篇文章Spring JMS开始根据请

  • 问题内容: 我正在使用EJB 3.1,并且想配置一个MDB来侦听多个队列。 我更喜欢通过XML定义队列名称,而其他通过注释定义。 能做到吗? 问题答案: 实例化后,MDB只能侦听在其目标ActivationConfigProperty中指定的资源,但是您 可以 为同一MDB创建具有不同目标的多个实例(在您的情况下为队列)。 在ejb-jar.xml中创建两个条目,它们具有不同的目的地和ejb-na

  • 我能否向社区咨询一下,听多个主题的最佳方式是什么,每个主题都包含一个不同类别的信息? 在过去的几天里,我一直在玩Spring Kafka。到目前为止我的思考过程:

  • 问题内容: 我当时在上网,但找不到很好的信息。我试图在每次运行应用程序时检测按键。我正在使用JavaFX并将其与FXML一起运行。我尝试了很多事情,但没有任何效果。请帮我。 问题答案: 您应该签出Ensemble示例。这是关键的侦听器代码。