Socket IO 在本地机器上运行良好,但在 Heroku 上不起作用
情况:
我正在使用 ReactJS 和 ExpressJS 构建一个 Web 应用程序 (SPA)。我正在使用 Socket.IO 进行实时聊天。当我构建我的应用程序并在本地主机上运行它时,一切正常,所以我决定将其部署在 Heroku 上。我的应用程序已在 Heroku 上成功构建并可供使用。
问题:
因此我进入我的应用程序以查看它是否在 Heroku 上正常运行。当我进入登录页面和注册页面时,应用程序似乎正常(这些页面与 Socket.IO 不兼容)。但是当我进入聊天页面(该页面使用 Socket.IO 进行实时聊天)时,客户端崩溃了,无法加载并抛出以下错误。
错误:
我收到以下错误:
> Uncaught TypeError: Cannot read property 'DEBUG' of undefined
at load (browser.js:168)
at Object.eval (browser.js:178)
at eval (browser.js:197)
at Object../node_modules/socket.io-client/node_modules/debug/src/browser.js (vendor.js:2639)
at __webpack_require__ (main.js:788)
at fn (main.js:151)
at eval (url.js:7)
at Object../node_modules/socket.io-client/lib/url.js (vendor.js:2628)
at __webpack_require__ (main.js:788)
at fn (main.js:151)
当我在线查看模块时,它有以下检查:
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
if (!r && typeof process !== 'undefined' && 'env' in process) {
r = undefined.DEBUG; //the error is showed here
}
因此我在本地主机上启动我的应用程序并搜索上述代码,我得到了这个:
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
if (!r && typeof process !== 'undefined' && 'env' in process) {
r = { /*A JSON object contains .env variables*/ }.DEBUG;
}
代码:
这是我的服务器:
//requirements...
const socket = require("./server/socket");
const app = express();
const server = http.createServer(app);
const port = process.env.PORT || 3000;
//middlewares...
//routes...
//database connection...
socket(server);
server.listen(port);
console.log("Server started on: " + port);
我的套接字设置:
const socketIO = require("socket.io");
const socket = server => {
const io = socketIO(server);
const chat = io.of("/chat");
chat.on("connection", client => {
console.log("User started chat!");
client.on("disconnect", () => {
console.log("User left chat!");
});
client.on("sendMessage", msg => {
const data = msg;
client.broadcast.emit("incomingMessage", { data });
});
});
};
module.exports = socket;
使用 Socket.IO 的 React 组件:
const _ChatBox = ({ props }) => {
const [connection] = useState(io("/chat"));
useEffect(() => {
connection.on("incomingMessage", message => {
//receive message...
});
}, []);
const sendMessageToSocket = data => {
connection.emit("sendMessage", data);
};
return (
/* JSX here */
);
};
我想要:
我想知道我的代码是否有问题。当我将我的应用部署到 Heroku 时,我需要在 Heroku 上进行任何额外设置才能使我的应用与 Socket.IO 配合使用吗?
在花费数小时研究和检查代码后,我终于弄清楚了为什么我的应用无法在 Heroku 上运行。这是因为客户端使用了
dotenv
模块,我在
webpack.config.js
中对其进行了设置:
//...requirements
const dotenv = require("dotenv");
const webpack = require("webpack");
module.exports = {
//...configs
plugins: [
//...other plugins
new webpack.DefinePlugin({
"process.env": JSON.stringify(dotenv.parsed)
})
]
};
然后,当我在 Heroku 上部署我的应用时,Heroku 将从源代码构建我的客户端,服务器将在
dist
文件夹中查找前端部分。客户端现在无法在 Heroku 上找到
.env
文件,因此无法加载导致其抛出错误的环境变量。
我删除了
dotenv
,因为我现在不需要它了。
问题不在于您粘贴的代码,至少我对此表示怀疑。如果您在线查看模块,您会看到它有以下检查:
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
if (!r && typeof process !== 'undefined' && 'env' in process) {
r = process.env.DEBUG;
}
您会注意到它正在从
process.env
读取,这是一个 Node 东西/Electron 东西。在客户端的控制台内,输入
window.process
,如果您得到一些东西,那可能就是它。它正在检查
process
... 可能是 webpack