NodeJs - express 和 socket.io 同端口集成
Posted
技术标签:
【中文标题】NodeJs - express 和 socket.io 同端口集成【英文标题】:NodeJs - express and socket.io same port integration 【发布时间】:2022-01-10 22:59:19 【问题描述】:我正在使用 NodeJs 和 Express 创建一个服务器,但我发现如果我想使服务上线,我需要使用 Socket.io。在这个服务器中,有一些服务不需要实时,这些都是使用快速路由来实现的。这是经过测试并且可以正常工作的。现在我必须让一些服务生效。所以,我想我也应该在我的服务器配置中实现 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)
,正如我在另一个 *** 问题中看到的那样,但终端显示此错误:
const io = require('socket.io').listend(app)
^
TypeError: require(...).listend is not a function
所以,我不知道如何整合这两者。我不知道是否值得使用同一个端口,或者我是否应该为套接字使用另一个端口,但我认为同一个端口会很好。如果有人知道如何在我当前的代码中实现 socket.io,或者知道如何同时保留这两种功能,请帮助我。非常感谢
【问题讨论】:
【参考方案1】:改变这个:
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 连接都可以通过一些自定义标头来识别,因此 socket.io 代码(实际上是底层的 webSocket 传输执行此操作)可以获取这些并独立于您的常规 http 请求来处理它们。
在socket.io doc 中查看大量示例,与早期相比有了很大改进。
有时,查看不同的示例很容易混淆,因为有十几种不同的方法可以创建与 Express 一起使用的 http 服务器。这里的一般想法是,无论您使用哪种方式,只需确保将您创建的 http 服务器实例分配给一个变量,然后您可以将其用于 socket.io 服务器初始化(如上所示)。在您的 Express 代码中,app
不是服务器。这就是 Express 应用程序对象,它也是一个 http 请求处理程序。这不是服务器。服务器是你从http.createServer()
获得的东西,或者是app.listen()
返回给你的东西(在内部调用http.createServer()
之后)。
【讨论】:
以上是关于NodeJs - express 和 socket.io 同端口集成的主要内容,如果未能解决你的问题,请参考以下文章
如何使用socket.io mysql nodejs express删除帖子
如何在套接字函数之外使用(socket.io)发射函数-nodejs,express