CRA Socket.io请求返回net :: ERR_CONNECTION_TIMED_OUT

时间:2020-07-24 19:15:57

标签: node.js reactjs socket.io

enter image description here

你好我花了一些时间没有运气试图理解这里的问题。

我已经仔细研究过StackOverflow上的每个问题,尽管到目前为止都没有任何效果。

我有一个使用Create React App和Socket.io(在localhost上运行良好)构建的简单聊天应用程序,但是当部署到我的Node服务器时,我收到ERR_CONNECTION_TIMED_OUT错误并且没有响应。该网站本身运行良好,但是当我调用Socket.io服务器时却出现了错误。

我猜这是由于我对Node和Socket.io的工作原理缺乏了解。

一些信息:

server.js

const path = require("path");
const express = require("express");
const app = express();
const http = require("http").createServer(app);

const port = 8080;

http.listen(port, () => console.log(`http: Listening on port ${port}`));

const io = require("socket.io")(http, { cookie: false });

app.use(express.static(path.join(__dirname, "build")));
app.get("/*", function (req, res) {
  res.sendFile(path.join(__dirname, "build", "index.html"));
});

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

  // Emitting a new message. Will be consumed by the client
  socket.on("messages", (data) => {
    socket.broadcast.emit("messages", data);
  });

  //A special namespace "disconnect" for when a client disconnects
  socket.on("disconnect", () => console.log("Client disconnected"));
});

client.js

....
const socket =
  process.env.NODE_ENV === "development"
    ? io("http://localhost:4001")
    : io("https://my-test-site:8080");

socket.on("messages", (msgs: string[]) => {
  setMessages(msgs);
});
....

docker-compose.yml

version: "X.X"
services:
  app:
    image: "my-docker-image"
    build:
      context: .
      dockerfile: Dockerfile
      args:
        DEPENDENCY: "my-deps"
    ports:
      - 8080:8080

Dockerfile

...
RUN yarn build

CMD node server.js // run my server.js
...

更新:我通过确保我的主端口仅用于运行Express(通过socket.io)来解决此问题-在我的设置中,端口为8080。相同的Docker容器,我认为我不需要创建和使用Express'cre​​ateServer'的https版本。

2 个答案:

答案 0 :(得分:0)

这似乎是您忘记了映射Docker容器的端口。 dockerfile中的暴露语句将仅为其他与容器共享docker网络的docker容器做广告,它们可以连接到容器的端口4001。

可以使用-p标志为docker run命令配置端口映射。在您的情况下,完整命令如下所示:

docker run -p 4001:4001 your_image_name

此外,您是否有签名证书?如果浏览器不信任您的服务器证书,则可能会阻止其连接。

答案 1 :(得分:0)

我通过仅保留一个端口(在我的情况下为:8080)来解决此问题。 express/socket.io正在使用此端口(最初我有两个不同的端口,一个用于我的站点,一个用于Express)。另外,就我而言,在同一Docker容器中运行时,我不需要服务器的require("https").createServer(app)(https)版本,因为http就足够了。