首页 > 解决方案 > 如何在 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。

我将如何解决这个问题,我知道有一些问题(在某种程度上)回答了这个问题,但它不包括我在受保护端点上使用中间件功能的事实?

标签: javascriptnode.jssocket.ioroutes

解决方案


如果用户通过身份验证,则当您获得/端点时,它应该向用户呈现 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;

推荐阅读