【问题标题】:Express server and socket.io not working in same portExpress 服务器和 socket.io 不在同一个端口工作
【发布时间】:2021-07-10 07:33:56
【问题描述】:

不工作在代码中找不到任何问题##

如果我输入任何端口号而不是服务器,它就可以工作,但为什么它不能与套接字服务器一起工作,任何人都可以解释 我尝试了一些解决方案,但它们都不起作用我想运行 socket.io 并在同一个端口号上表达

const express = require('express');
const cors = require("cors");
const socketIO = require('socket.io');
const http = require('http');
const app = express();
const server = http.createServer(app);
const passport = require("passport");
const authRoute = require('./routes/auth');
const userRoute = require('./routes/user');
const PORT = process.env.PORT || 9000;
const db = require('./config/mongoose');
app.use(express.json());
app.use(cors());

app.use(passport.initialize());
require("./config/passport")(passport);

app.use(express.json());
app.use("/api/auth", authRoute);
app.use("/api/user", passport.authenticate('jwt', { session: false }),userRoute);

if(process.env.NODE_ENV === 'production')
{
    app.use(express.static('client/build'))
}

如果我将服务器切换到任何端口号都可以,这就是问题

const io = socketIO(server, {
    cors: {
        origin: '*',
    }
});
let state = {};
io.on("connection", (socket) => {
    const { id } = socket.client;
    socket.on('disconnect', function () {
        console.log('socket disconnected!');
    });
    socket.on('join_room', function (data) {
        console.log('joining request rec.', data);

        socket.join(data.room);

        io.in(data.room).emit('user_joined', data);
    });
    socket.on('send_code', function (data) {
        io.in(data.room).emit('receive_code', data);
    });
});

app.listen(PORT, function (err) {
    if(err){
        console.log(err);
        return;
    }
    console.log(`Server is up and running on port: ${PORT}`);
});

【问题讨论】:

    标签: node.js express socket.io port


    【解决方案1】:

    http.createServer(app)app.listen() 不兼容,因为它们都试图做同样的事情。如果您查看app.listen() 的源代码,您会看到:

    app.listen = function listen() {
      var server = http.createServer(this);
      return server.listen.apply(server, arguments);
    };
    

    所以,它创建了一个不同的服务器对象。你最终得到了两个,而第一个永远不会启动,所以当你把它交给 socket.io 时,它永远不会工作。

    相反,删除它:

    const server = http.createServer(app);
    

    并且,改用这个:

    const server = app.listen(PORT, function (err) { ...});
    

    这样,您的server 变量将包含唯一一个实际运行的服务器对象。


    或者,您可以删除app.listen(),然后将其添加到它的位置:

    server.listen(PORT, ...);
    

    一般的想法是你想要这对:

    const server = http.createServer(app);
    server.listen(PORT, ...);
    

    或者,就是这样:

    const server = app.listen(PORT, ...);
    

    您不能同时使用两者。无论哪种方式,server 对象都将代表实际运行的服务器,并将与 socket.io 一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 2013-12-18
      • 2018-04-27
      • 2017-11-04
      • 2022-01-10
      相关资源
      最近更新 更多