【问题标题】:CRA Socket.io request returns net::ERR_CONNECTION_TIMED_OUTCRA Socket.io 请求返回 net::ERR_CONNECTION_TIMED_OUT
【发布时间】:2020-07-24 19:15:57
【问题描述】:

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

我查看了 StackOverflow 上似乎处理相同问题的每个问题,但到目前为止没有任何效果。

我有一个使用 Create React App 和 Socket.io 构建的简单聊天应用程序(在 localhost 上运行良好),但是当部署到我的节点服务器时,我收到 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 'createServer' 的 https 版本。

【问题讨论】:

    标签: node.js reactjs socket.io


    【解决方案1】:

    您好像忘记映射 docker 容器的端口了。您的 dockerfile 中的 expose 语句只会宣传与您的容器共享 docker 网络的其他 docker 容器,它们可以连接到您容器的 4001 端口。

    端口映射可以使用 docker run 命令的-p 标志进行配置。在你的情况下,完整的命令看起来像这样:

    docker run -p 4001:4001 your_image_name

    另外,你有签名证书吗?如果浏览器不信任您的服务器证书,它们可能会阻止连接。

    【讨论】:

    • 感谢您的回复。我已经用更多信息更新了我的问题(https 似乎没有什么不同)。另外,我有一个定义了端口的 docker-compose.yml,但我仍然遇到同样的错误。恐怕 Docker 目前对我来说没有多大意义。我需要在每次部署期间运行docker run -p 4002:4002 image_name 命令吗?还是在本地开发期间只进行一次?
    • 感谢您添加附加信息。您每次都需要运行 docker run 命令。不过,您已经有一个 compose 文件,在这种情况下,docker 守护进程将在重新启动等后恢复您正在运行的 docker-compose 项目。您的 docker-compose 规范看起来也不错。
    • 你检查过你的节点容器的docker日志吗? (docker-compose logs -f)
    • 刚才提到的服务器端渲染应该不会有任何影响。我猜这一定与服务器设置有关,因为我认为从上面的设置 Socket.io 应该可以工作。
    • 似乎 Dockerfiles 的“CMD node server.js”命令可能无法正常工作,因为我将其更改为指向不存在且未出错的脚本(我更新了最初的问题) .不知道为什么它没有失败。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 2022-01-03
      • 1970-01-01
      • 2015-04-08
      • 2017-09-01
      • 2017-01-22
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多