javascript - 如何在 Nodejs express 端点上运行 Socket.io
问题描述
我想将所有东西都保存在一个服务器中,这就是为什么我想实现一个 socket.io 服务器来处理来自我的产品在我的身份验证 Web 服务器之上的连接。
目前,我有一个中间件函数来验证给定的 auth-token 是否有效:
验证令牌.js:
const jwt = require('jsonwebtoken');
module.exports = function(req, res, next){
// Check if auth-token is avaliable
const token = req.header('auth-token');
if(!token) return res.status(401).send('Access denied');
try{
const verified = jwt.verify(token, "secret");
req.user = verified;
next()
}catch (err){
// Invalid token - not logged in
res.status(201).send('Access denied');
}
}
我可以在只能由登录的有效用户访问的任何端点上使用此中间件:
const router = require('express').Router();
const verify = require('../authentication_routes/verifyToken');
router.get('/', verify, (req,res) => {
res.send('logged in');
});
module.exports = router;
我将如何在此路由器中实现 socket.io 服务器,NodeJS 应用程序本身从端口 3000 运行,并且 id 就像任何访问该路由器的端点连接到 socket.io 服务器的人一样。我试过这个:
const router = require('express').Router();
const io = require('socket.io')(3000);
const verify = require('../authentication_routes/verifyToken');
router.get('/', verify, (req,res) => {
io.on('connection', socket => {
socket.emit('connection-established', 'Connected');
});
});
module.exports = router;
但它显然不起作用,因为 NodeJS 服务器已经在使用端口 3000。
我将如何解决这个问题,我知道有一些问题(在某种程度上)回答了这个问题,但它不包括我在受保护端点上使用中间件功能的事实?
解决方案
如果用户通过身份验证,则当您获得/
端点时,它应该向用户呈现 HTML 页面(聊天界面)您的代码应该是这样的
const router = require('express').Router();
const server = require("http").Server(router)
const io = require("socket.io")(server)
port = process.env.PORT || 3000
server.listen(port)
const verify = require('../authentication_routes/verifyToken');
router.get('/', verify, (req,res) => {
io.on('connection', socket => {
socket.emit('connection-established', 'Connected');
});
});
module.exports = router;
推荐阅读
- scala - 有没有办法使用 scalafmt 按名称对 scala 类/对象中的函数进行排序?
- spring - 使用 Spring Security 检索可操作的 LDAP 属性
- dns - 为什么没有单字母 TLD 或带数字的 TLD?
- amazon-web-services - 需要在 AWS lambda 中创建超链接
- powershell - 我想在我的桌面上执行“google chrome”的目标路径
- macos - SSH 使用端口转发时显示错误的 IP 地址
- azure-data-factory - 自动缩放按需 HDInsight 群集
- macos - setsockopt() 的 macOS SO_REUSEPORT
- c# - Xamarin.Forms 找不到 EntityFramework.Core 的迁移
- travis-ci - 为什么 Travis-CI 用 18 秒来构建一个简单的 C 代码?