Node.js 为什么不调用socket.io?
我正在开发我的NodeJS/Express应用程序,并将socket.io库添加到我的项目中,并在index.js文件中使用它Node.js 为什么不调用socket.io?,node.js,express,socket.io,Node.js,Express,Socket.io,我正在开发我的NodeJS/Express应用程序,并将socket.io库添加到我的项目中,并在index.js文件中使用它 require("dotenv").config(); const express = require("express"); const expressLayouts = require("express-ejs-layouts"); const cors = require("cors"
require("dotenv").config();
const express = require("express");
const expressLayouts = require("express-ejs-layouts");
const cors = require("cors");
const path = require("path");
const mongoose = require("mongoose");
const session = require("express-session");
const http = require("http");
const socketIO = require("socket.io");
const notFoundMiddleware = require("./src/middleware/notFound");
const passport = require("./src/passport/setup");
const indexRouter = require("./src/routes");
const userRouter = require("./src/routes/user");
const bookRouter = require("./src/routes/book");
const app = express();
const server = http.Server(app);
const io = socketIO(server);
io.on("connection", (socket) => {
const { id } = socket;
console.log(`Socket connected: ${id}`);
const { roomName } = socket.handshake.query;
console.log(`Socket roomName: ${roomName}`);
socket.join(roomName);
socket.on("message-to-room", (msg) => {
console.log("msg ", msg);
msg.type = `room: ${roomName}`;
socket.to(roomName).emit("message-to-room", msg);
socket.emit("message-to-room", msg);
});
socket.on("disconnect", () => {
console.log(`Socket disconnected: ${id}`);
});
});
app.use((req, res, next) => {
req.io = io;
next();
});
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(
session({
secret: process.env.COOKIE_SECRET,
resave: false,
saveUninitialized: false,
})
);
app.use(passport.initialize());
app.use(passport.session());
app.use(expressLayouts);
app.set("layout", "./layouts/index");
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "src", "views"));
app.use(cors());
app.use("/public", express.static(path.join(__dirname, "public")));
app.use("/", indexRouter);
app.use("/user", userRouter);
app.use("/books", bookRouter);
app.use(notFoundMiddleware);
const PORT = process.env.PORT || 3000;
const UserDB = process.env.DB_USERNAME || "root";
const PasswordDB = process.env.DB_PASSWORD || "AXRHV]cy?s/4UkZ";
const NameDB = process.env.DB_NAME || "books_database";
const HostDB = process.env.DB_HOST || "mongodb://localhost:27017/";
const start = async () => {
try {
const UrlDB = `mongodb+srv://${UserDB}:${PasswordDB}@cluster0.m4q9c.mongodb.net/${NameDB}?retryWrites=true&w=majority`;
await mongoose.connect(encodeURI(UrlDB), {
useCreateIndex: true,
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
});
server.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
} catch (e) {
console.log(e);
}
};
start();
在那之后,我试着在其中一条路线上使用它
router.post("/addComment", isAuthenticatedMiddleware, async (req, res) => {
const { io } = req;
const { bookId, comment } = req.body;
const { user: currentUser } = req.user;
const currentDate = new Date().toISOString();
try {
const book = await Book.findByIdAndUpdate(
{ _id: bookId },
{
$push: {
comments: { user: currentUser, text: comment, sentAt: currentDate },
},
},
{
new: true,
fields: {
comments: {
$slice: -1,
},
},
}
).populate({
path: "comments",
populate: { path: "user", select: "name" },
});
const newComment = book.comments[0];
io.emit("message-to-room", newComment);
res.send({
status: "ok",
});
} catch (err) {
console.log(err);
res.send({
status: "error",
});
}
});
我没有收到任何错误,但我看起来好像从来没有发生过,或者它没有像我预期的那样工作。我的代码可能有什么问题?什么是永远不会发生的?我看到这里的
io.emit()
和socket.emit()
正在向客户端发送消息。您不会显示用于侦听这些消息的客户端代码,也不会显示如何从客户端调用触发这些消息的路由。我可以想出几个原因来解释为什么您可能看不到这些.emit()
语句的结果,但这完全取决于是否看到其余的相关代码。