node.js - 如何连接部署在 Heroku 上的套接字 io
问题描述
我在本地主机上运行聊天应用程序,它运行正常,但是当我部署回 Heroku 和 Front 到 Versel 时,一切都无法正常工作。起初,我只是到处更改地址,在前面的套接字上给出状态 200,在后面 - 404。
现在,一般情况下,socket.io 的设置是空的,如下面的代码所示。有时我将完整的地址放在 Heroku 中,在 env 变量中指明端口(每次发出的方式不同),但没有帮助。如果我在前面用“:PORT”在 Heroku 上指明应用程序的路径,那么我会收到 CORS 错误。拜托,我已经和它战斗了三天。我尝试使用“https://chat-lite-back.herokuapp.com/”作为套接字 URL,尝试在 Heroku 中使用配置变量 - 也许我用错了。
Front只是一个帮助文件,它被导出到一些组件并用作“socket.on smth ...”:
import { io } from "socket.io-client";
export const socket = io();
回来了:
const express = require("express");
const app = express();
const cors = require("cors");
const { UserModel } = require("./models");
const prettyDate2 = require("./helpers/time");
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.options("https://chat-lite-two.vercel.app", cors());
const mongoose = require("mongoose");
require("dotenv").config();
const http = require("http").createServer(app);
const io = require("socket.io")(http);
http.listen(3001, function () {
console.info("Server is running");
console.log(io);
});
io.on("connection", (socket) => {
console.log("SOCKET", socket);
console.info("Socket connected", socket.id);
// socket.broadcast.emit("user:join", socket.id);
socket.on("message:send", (data) => {
const dateMessage = prettyDate2();
const { nickname, text, id } = data;
const newData = { nickname, text, id, dateMessage };
socket.broadcast.emit("message:fromServer", newData);
socket.emit("message:fromServer", newData);
});
socket.on("typing", (data) => {
const { user, typing } = data;
socket.broadcast.emit("userTyping", user, typing);
});
socket.on("stopTyping", () => {
socket.broadcast.emit("userStoppedTyping");
});
socket.on("message:delete", (id) => {
socket.emit("DeletingMessage", id);
socket.broadcast.emit("DeletingMessage", id);
});
});
function getSocketIo() {
return io;
}
module.exports.getSocketIo = getSocketIo;
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.info("DB connect");
app.listen(PORT || 3000, () => {
console.info("server running");
});
})
.catch((err) => {
console.error(err);
});
heroku 日志示例:
2021-08-07T16:35:12.383736+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=4&transport=polling&t=NiXT-M7" host=chat-lite-back.herokuapp.com request_id=a9543ade-6cc6-4e39-b413-d73c875e2c45 fwd="188.162.86.199" dyno=web.1 connect=0ms service=2ms status=404 bytes=425 protocol=https
在前面,状态为 200:
https://chat-lite-two.vercel.app/socket.io/?EIO=4&transport=polling&t=NiXUBOr
我的 GitHub 前面有代码:https ://github.com/mrmadgav/chat-lite/
UPD:改回在服务器端使用这样的套接字中的属性:
const io = require("socket.io")(http, {
cors: {
origin: "https://chat-lite-two.vercel.app/",
methods: ["GET", "POST"],
credentials: true,
},
});
在客户端就像这样:
import { io } from "socket.io-client";
export const socket = io("https://chat-lite-back.herokuapp.com/git ", {
withCredentials: true,
});
通过这种方式,我在 Heroku Heroku 日志上出现了 Front & CORS/503 错误的 CORS 错误:
2021-08-07T17:15:22.431397+00:00 app[api]: Release v51 created by user madgav@mail.ru
2021-08-07T17:15:22.431397+00:00 app[api]: Deploy 946fb55a by user madgav@mail.ru
2021-08-07T17:15:25.000000+00:00 app[api]: Build succeeded
2021-08-07T17:15:30.338990+00:00 heroku[web.1]: Starting process with command `npm start`
2021-08-07T17:15:34.684288+00:00 app[web.1]:
2021-08-07T17:15:34.684307+00:00 app[web.1]: > server@1.0.0 start /app
2021-08-07T17:15:34.684308+00:00 app[web.1]: > node server.js
2021-08-07T17:15:34.684308+00:00 app[web.1]:
2021-08-07T17:15:36.433645+00:00 heroku[web.1]: State changed from starting to up
2021-08-07T17:15:37.238945+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=4&transport=polling&t=NiXdClB" host=chat-lite-back.herokuapp.com request_id=b80802c1-9467-454b-a38e-65c86bb51493 fwd="92.255.176.12" dyno=web.1 connect=0ms service=214ms status=200 bytes=350 protocol=https
2021-08-07T17:15:37.202365+00:00 app[web.1]: Server is running
2021-08-07T17:15:38.302272+00:00 app[web.1]: DB connect
2021-08-07T17:15:38.306572+00:00 app[web.1]: events.js:377
2021-08-07T17:15:38.306575+00:00 app[web.1]: throw er; // Unhandled 'error' event
2021-08-07T17:15:38.306575+00:00 app[web.1]: ^
2021-08-07T17:15:38.306576+00:00 app[web.1]:
2021-08-07T17:15:38.306577+00:00 app[web.1]: Error: listen EADDRINUSE: address already in use :::4133
2021-08-07T17:15:38.306577+00:00 app[web.1]: at Server.setupListenHandle [as _listen2] (net.js:1320:16)
2021-08-07T17:15:38.306577+00:00 app[web.1]: at listenInCluster (net.js:1368:12)
2021-08-07T17:15:38.306578+00:00 app[web.1]: at Server.listen (net.js:1454:7)
2021-08-07T17:15:38.306579+00:00 app[web.1]: at Function.listen (/app/node_modules/express/lib/application.js:618:24)
2021-08-07T17:15:38.306580+00:00 app[web.1]: at /app/server.js:86:9
2021-08-07T17:15:38.306581+00:00 app[web.1]: at processTicksAndRejections (internal/process/task_queues.js:95:5)
2021-08-07T17:15:38.306581+00:00 app[web.1]: Emitted 'error' event on Server instance at:
2021-08-07T17:15:38.306582+00:00 app[web.1]: at emitErrorNT (net.js:1347:8)
2021-08-07T17:15:38.306582+00:00 app[web.1]: at processTicksAndRejections (internal/process/task_queues.js:82:21) {
2021-08-07T17:15:38.306582+00:00 app[web.1]: code: 'EADDRINUSE',
2021-08-07T17:15:38.306583+00:00 app[web.1]: errno: -98,
2021-08-07T17:15:38.306583+00:00 app[web.1]: syscall: 'listen',
2021-08-07T17:15:38.306584+00:00 app[web.1]: address: '::',
2021-08-07T17:15:38.306584+00:00 app[web.1]: port: 4133
2021-08-07T17:15:38.306585+00:00 app[web.1]: }
2021-08-07T17:15:38.369491+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2021-08-07T17:15:38.370277+00:00 app[web.1]: npm ERR! errno 1
2021-08-07T17:15:38.393109+00:00 app[web.1]: npm ERR! server@1.0.0 start: `node server.js`
2021-08-07T17:15:38.393387+00:00 app[web.1]: npm ERR! Exit status 1
2021-08-07T17:15:38.393718+00:00 app[web.1]: npm ERR!
2021-08-07T17:15:38.393938+00:00 app[web.1]: npm ERR! Failed at the server@1.0.0 start script.
2021-08-07T17:15:38.394144+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2021-08-07T17:15:38.420356+00:00 app[web.1]:
2021-08-07T17:15:38.420621+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2021-08-07T17:15:38.420812+00:00 app[web.1]: npm ERR! /app/.npm/_logs/2021-08-07T17_15_38_395Z-debug.log
2021-08-07T17:15:38.476323+00:00 heroku[web.1]: Process exited with status 1
2021-08-07T17:15:38.543452+00:00 heroku[web.1]: State changed from up to crashed
2021-08-07T17:15:43.016858+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/socket.io/?EIO=4&transport=polling&t=NiXdG9o" host=chat-lite-back.herokuapp.com request_id=a5acae71-e904-43c1-bfa6-20ad18ccdadd fwd="92.255.176.12" dyno= connect= service= status=503 bytes= protocol=https
解决方案
推荐阅读
- java - 找不到 apache poi 库
- javascript - 带有随机数据问题的时间序列的 Javascript 实时图表
- javascript - 为什么 input[type='tel'] 允许输入非数字字符?
- api - 如何使用 Blogger API 将我的帖子划分为不同的 FeedActivity?
- python - Python动态递增数字
- c++ - 使用 g++ 编译的 C++ 代码有效,但 XCode 失败
- c - 在 HP Tandem 上将数据从 C 发送到 COBOL
- jquery - 来自 WordPress 的 jQuery 版本不适用于我的函数,我无法更改 jQuery 版本
- python-3.x - 使用用户输入作为变量的一部分
- javascript - 在 FaunaDB 中将 Merge 与单个 Create 调用一起使用会创建两个文档吗?