Node.js 为什么不调用socket.io?

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"

我正在开发我的NodeJS/Express应用程序,并将socket.io库添加到我的项目中,并在index.js文件中使用它

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()
语句的结果,但这完全取决于是否看到其余的相关代码。