I am trying to learn socket.io for private chat in my project In my backend i am using node and express and sending chat page on route "/chat"
- 应用程序. js**
import http from "http";
import express from "express";
import bodyParser from "body-parser";
import cookieParser from "cookie-parser";
import dotenv from "dotenv";
import { router } from "./routes/web.js";
import { connectDb } from "./db/connectDb.js";
// configuring dotenv
dotenv.config();
// initialize app
const app = express();
// server
const node__server = http.createServer(app);
// static files
app.use(express.static('../frontend'));
// middlewares
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
// load routes
app.use("/", router);
// define template engine
app.set("view engine", "ejs");
// connecting database
connectDb(process.env.DATABASE_URL);
// Listening to browser port
node__server.listen(process.env.PORT, () => {
console.log(`App is listening at http://localhost:${process.env.PORT}`);
});
export { node__server };
- 聊天句柄. js**
import { Server } from "socket.io";
import { node__server } from "./app";
// socket
const io = new Server(node__server);
io.of("/chat").on("connection", (socket) => {
console.log(socket.id);
})
- 在client.js(聊天页面脚本)中**
const socket = io("/chat");
socket.on("connect",()=>{
console.log("client connected");
})
2条答案
按热度按时间ljo96ir51#
如果您的原始代码是这样开始的:
然后,一个问题是
chatHandle.js
代码永远不会加载或运行。所以,你永远不会得到一个Socket.io服务器连接到你的http服务器。看起来你可以通过改变你的启动来解决这个问题:
因为
chatHandle.js
会加载app.js
。按照当前的代码组织方式,您不能只从app.js
加载chatHandle.js
,因为这会创建一个循环依赖关系,其中chatHandle.js
加载app.js
,app.js
加载chatHandle.js
。我更喜欢的结构是从
app.js
加载chatHandle.js
,但是让chatHandle.js
在加载时不做任何初始化。相反,导出一个socketioInit()
函数,然后从app.js
调用它,并将server
示例传递给它,这样它就可以socket.io使用该服务器设置www.example.com。这就形成了你的套接字。完全独立于服务器的创建,并且可以在不同地设置HTTP服务器的不同项目中使用。yjghlzjz2#