【问题标题】:nodejs socket.io socket on is not a functionnodejs socket.io socket on 不是一个函数
【发布时间】:2019-11-21 14:58:33
【问题描述】:

我有一个中间件来通过 jwt 验证我的套接字 但我在其他文件夹中制作新事件时遇到问题 不要在我的 app.js 中获取所有内容

我这样做是为了验证我的套接字:

  let io = require('socket.io')(server);
  app.set("io", io);

  io.use(verify.passportJwtAuth);
  io.on('connection', function(socket) {
    console.log('Authentication passed!');
    // now you can access user info through socket.request.user
    // socket.request.user.logged_in will be set to true if the user was authenticated
    socket.emit('success', {
      message: 'success logged in!'
    });
  });

中:

async passportJwtAuth(socket,next) {
    const secret =  config.jwt.secret;
    const token = socket.handshake.query.token;
    jwt.verify(token, secret, function(err, decoded) {
        if(err) {
            return next(err);
        }
        console.log("sucess");
        return next();
    });
} 

我尝试创建一个新的event

const socketRouter = require('./routes/socket');
  io.use(verify.passportJwtAuth);
  io.on('connection', function(socket) {
    console.log('Authentication passed!');
    // now you can access user info through socket.request.user
    // socket.request.user.logged_in will be set to true if the user was authenticated
    socket.emit('success', {
      message: 'success logged in!'
    });
  });
socketRouter.configuration();

我的socketRouter.configuration:

const socketController = require ('../controllers/SocketController');
const verify = require('../auth/index');
const socket = require('socket.io');
module.exports = {    
   configuration: () => {        
      socket.on ('message', (message) => {
         socket.emit ('myevent', {message: 'Ok, You are signed in'});
         console.log (message);
         console.log (`Socket $ {socket.id}`)
       });
   }
}

错误:

C:\Users\SpiriT\Documents\Projetos\FtcJokenPo\back\src\routes\socket.js:6
      socket.on ('message', (message) => {
             ^

TypeError: socket.on is not a function
    at Object.configuration (C:\Users\SpiriT\Documents\Projetos\FtcJokenPo\back\src\routes\socket.js:6:14)
    at Object.<anonymous> (C:\Users\SpiriT\Documents\Projetos\FtcJokenPo\back\src\app.js:36:14)

我不想将所有套接字逻辑都留在我的 app.js 中

同样,当我打开服务器时,我已经调用了这个模块(我希望它只在我在前端使用 socket.on 时调用)

有人可以帮帮我吗?

我的前端:

verify = () => {
    let socket = null;
    var token = 312312312;
    socket = io('http://localhost:8080', {
    query: {token: token}
    });
    socket.on('error', function(err) {
       console.error(err);
      });
      // Connection succeeded
      socket.on('success', function(data) {
        console.log(data.message);
      })
}

【问题讨论】:

  • 您必须将您创建的io 实例共享给任何其他希望使用它的文件。

标签: node.js socket.io


【解决方案1】:

在您的 socketRouter.configuration 文件中,使用下面的代码,您的 socket 变量不是您需要的。看起来您希望它是一个特定的连接套接字,您可以在其上侦听传入消息。您正在尝试使用:

 const socket = require('socket.io');

获取该套接字,但这只是 socket.io 模块的导出对象,与现有连接的套接字无关。

您需要做的似乎是将特定套接字传递给您的配置函数,然后在您的函数中使用该参数。先把配置模块改成这样:

const socketController = require ('../controllers/SocketController');
const verify = require('../auth/index');
module.exports = {    
   configuration: (socket) => {        
      socket.on ('message', (message) => {
         socket.emit ('myevent', {message: 'Ok, You are signed in'});
         console.log (message);
         console.log (`Socket $ {socket.id}`)
       });
   }
}

这将删除require('socket.io') 行并在配置函数中添加socket 参数。


然后,在调用 configuration() 函数的地方,您需要传递 socket 参数:

  const socketRouter = require('./routes/socket');
  io.use(verify.passportJwtAuth);
  io.on('connection', function(socket) {
    console.log('Authentication passed!');
    // now you can access user info through socket.request.user
    // socket.request.user.logged_in will be set to true if the user was authenticated
    socket.emit('success', {
      message: 'success logged in!'
    });

    // let the socketRouter add any message handlers it wants to for this socket
    socketRouter.configuration(socket);      
  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2016-01-21
    • 2019-03-30
    相关资源
    最近更新 更多