NodeJs - express 和 socket.io 同端口集成

NodeJs - express and socket.io same port integration

我正在使用 NodeJs 和 Express 创建服务器,但我发现如果我想让服务上线,我需要使用 Socket.io。在这个服务器中,有一些服务是不需要上线的,这些都是用express route实现的。这已经过测试并且可以正常工作。现在我必须让一些服务上线。所以,我想我也应该在我的服务器配置中实现 socket.io 。这是我没有 socket.io 的代码,完美运行:

const express = require('express');
const morgan = require('morgan');
const cors = require('cors');
const mongoose = require('mongoose');

require('dotenv').config();

const app = express();
const port = process.env.port || 5050;

app.use(morgan('dev'));

app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended:true }));

const uri = process.env.ATLAS_URI;
mongoose.connect(uri, {useNewUrlParser:true});

const connection = mongoose.connection;
connection.once('open', () => console.log('Connected'));

const routes = require(#every routes);


app.use(routes);//all created routes


app.listen(port, () => {console.log(`Server listening on port ${port}`)});

现在,我应该正确导入 socket.io。完成后,我想我可以找出正确的热点来实施我的服务。因此,我尝试添加行 const io = require('socket.io').listend(app) 正如我在另一个 Whosebug 问题中看到的那样,但终端显示此错误:

const io = require('socket.io').listend(app)
                                ^

TypeError: require(...).listend is not a function

所以,我不知道如何整合这两者。我不知道是否值得使用相同的端口,或者我是否应该为套接字使用另一个端口,但我认为相同的端口会很好。如果有人知道如何在我当前的代码中实现 socket.io,或者知道如何保持这两种功能,请帮助我。非常感谢

改变这个:

app.listen(port, () => {console.log(`Server listening on port ${port}`)});

对此:

const httpServer = app.listen(port, () => {console.log(`Server listening on port ${port}`)});

然后,添加:

const { Server } = require("socket.io");
const io = new Server(httpServer );

这将使您的 Express 服务器和 socket.io 服务器共享同一个 http 服务器。由于所有传入的 socket.io 连接都可以通过一些自定义 headers 进行识别,因此 socket.io 代码(实际上是底层 webSocket 传输执行此操作)可以获取这些连接并独立于您的常规 http 请求进行处理。

socket.io doc 中查看大量示例,与早期相比有了很大改进。

有时,查看不同的示例很容易混淆,因为有十几种不同的方法来创建与 Express 一起使用的 http 服务器。这里的一般想法是,无论您使用哪种方式,只需确保将您创建的 http 服务器实例分配给一个变量,然后您可以使用 socket.io 服务器初始化(如上所示)。在您的 Express 代码中,app 不是服务器。那就是 Express 应用程序 object,它也是一个 http 请求处理程序。这不是服务器。服务器是您从 http.createServer() 获得的东西或 app.listen() returns 给您的东西(在内部调用 http.createServer() 之后)。