你好我花了一些时间没有运气试图理解这里的问题。
我已经仔细研究过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'createServer'的https版本。
答案 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
就足够了。