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()
之后)。
我正在使用 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()
之后)。