【问题标题】:Socket.io server on "connection" not firing, same for the client event not firing“连接”上的 Socket.io 服务器未触发,客户端事件未触发也是如此
【发布时间】:2021-12-10 05:45:15
【问题描述】:

您好,尝试使用套接字 io 构建快速后端,但无论出于何种原因,我都无法触发连接事件。我在服务器和客户端上使用的是 3.1.2 版本,所以这不是问题。一旦我启动客户端应用程序,我会在快速服务器中获得一些日志,如下所示:

::ffff:127.0.0.1 - - [24/Oct/2021:11:14:10 +0000] "GET /socket.io/?EIO=4&transport=polling&t=Noo0Wgb&b64=1 HTTP/1.1" 404 149 "-" "node-XMLHttpRequest"

但是 on connection 事件不会在任何一方触发。

const dotenv = require("dotenv").config();
const express = require("express");
const app = express();
const server = require("http").createServer(app);
const morgan = require("morgan");
const cors = require("cors");
const config = require("./src/config/general");
const io = require("socket.io")(server);

const SECURITY_KEY = process.env.SECURITYKEY;

//database
const connect = require("./src/config/database/connect");


app.set("json spaces", 2);
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cors());
app.use(morgan("combined"));

//controllers
const ExchangeController = require("./src/api/exchange/exchange.controller");
const exchangeController = new ExchangeController(io);  //initially wanted to socket logic in that file, but even in the server.js its not working either
const LogController = require("./src/api/log/log.controller");
const logController = new LogController();
const StrategyController = require("./src/api/strategy/strategy.controller");
const strategyController = new StrategyController();

app.set("json spaces", 2);
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cors());
app.use(morgan("combined"));

app.use("/api/exchange", exchangeController.router);
app.use("/api/log", logController.router);
app.use("/api/strategy", strategyController.router);

io.on("connection", (socket) => {
  console.log("incoming socket connection");
  socket.on("buy", async (data) => {
    try {
      let payload = JSON.parse(data);
      let symbols = payload.symbol.split(",");
      let strategy;

      if (payload.hasOwnProperty("strat")) {
        strategy = payload.strat;
      }
      if (payload.security == SECURITY_KEY) {
        for (let i = 0; i < symbols.length; i++) {
          exchangeManager.performStrategy(strategy, symbols[i]);
        }
      }
    } catch (error) {
      console.log("io.on", error.message);
    }
  });
});


app.listen(config.PORT, async () => {
  await connect();
  console.log(`server started on port ${config.PORT}`);
});

客户端测试代码

//client.js
const io = require('socket.io-client');

const socket = io("ws://localhost:3000")
// Add a connect listener
socket.on('connect', function (socket) {
    console.log('Connected!');
  
});

socket.on('error', function (socket) {
    console.log('error!');
  
});

我完全迷失了这一点,并且尝试了一切都没有成功。

【问题讨论】:

  • 不太确定我的评论,但您是否在服务器端指定您绑定到端口 3000 ?我认为express js服务器识别出有请求传入(如日志所示)。但是 express js 代码中没有任何东西绑定到端口3000,所以 express js 服务器什么也不做返回
  • 我已经更新了初始帖子和服务器端代码以包含我已经实现绑定到端口 3000 的 app.listen 方法。如果我没有在客户端应用程序上指定端口 3000,服务器甚至不会放出任何日志。所以端口绑定工作在 3000
  • 我自己解决了这个错误。我在做 app.listen 而不是 server.listen 大声笑,有时它就像尝试了 5 个小时后一样简单..
  • 我也感到这样做的痛苦...哦,顺便说一句,如果您找到自己问题的答案,我相信您可以自己回答并接受它

标签: javascript node.js express socket.io


【解决方案1】:

通过将 app.listen 切换到 server.listen 来解决错误,我的错。

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    相关资源
    最近更新 更多