在模块和路由中使用socket.io Express

时间:2018-01-08 05:04:47

标签: node.js express socket.io

我在使用socket.io时遇到了一些问题。我已经彻底改变了我的方式,但是除了能够将userdata发送回我的套接字连接之外,一切似乎都有效:

这是我的io.js文件:/config/io

/*jshint esversion: 6*/

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

// Socket stuff
io.on('connection', function (socket) {

  socket.on('login', function (userdata) {
    socket.handshake.session.userdata = userdata;
    socket.handshake.session.save();
    console.log(socket.handshake.session.userdata);
  });

  // Server Time
  var interval = setInterval(function () {
      var momentNow = moment();
      var data = momentNow.format('LT');
      socket.emit('time', data);
    }, 60000);

  // Chat - Needs work
  socket.on('chat', function (msg) {
    console.log(msg);
    var username = 'Message'; //socket.handshake.session.userdata.username;
    var message = '[' + moment().format('LT') + '] ' + username + ': ' + msg;
    io.emit('message', message, username);
  });

  socket.on('disconnect', function () {
    if (socket.handshake.session.userdata) {
      delete socket.handshake.session.userdata;
      socket.handshake.session.save();
    }

    console.log('user disconnected');
  });

});

module.exports = io;

以下是我尝试发布数据/config/passport的地方:(请注意,userdata确实包含正确的信息!)

/*jshint esversion: 6 */
const LocalStrategy = require('passport-local').Strategy;
const db = require('../config/db');
const bcrypt = require('bcryptjs');
var io = require('./io');

module.exports = function(passport) {

  // Local Strategy login
  passport.use(new LocalStrategy(function(username, password, done) {

    // Match Username
    let sql = 'SELECT * FROM users WHERE username = ?';
    db.query(sql, [username], function(err, rows) {
      if (err)
        return done(err);
      if (!rows.length) {
        return done(null, false, {
          type: 'loginMessage',
          message: 'Wrong Login',
        });
      }

      //  Match Password
      bcrypt.compare(password, rows[0].password, function(err, isMatch) {
        if (err)
          return done(err);
        if (isMatch) {
          var userdata = rows[0];
          io.emit('login', userdata); // HERE IS WHERE I TRY TO EMIT IT
          // console.log(rows[0]);
          return done(null, rows[0]);
        } else {
          return done(null, false, {
            type: 'loginMessage',
            message: 'Wrong Login',
          });
        }
      });
    });
  }));

现在这是我的主要app文件:(遗漏了一堆东西)

var io = require('./config/io');

// Init App
const app = express();

// Init http server
const server = http.createServer(app);

// Attach IO
io.attach(server);

// Listen
server.listen(8080, function () {
  console.log('Server listening on port 8080...');
});

现在,除了能够发出数据外,一切似乎都运行正常。现在我也尝试在客户端进行日志记录(以防它在客户端而不是服务器端发出),但它也没有这样做。

1 个答案:

答案 0 :(得分:0)

好的,这是一个实际的工作答案。这是一个解决方法,我完全放弃了尝试从护照登录处理程序本身做到这一点。但这是我如何做到的:

IO代码:

  var session = socket.handshake.session;
  socket.on('login', function () {
    if (socket.handshake.session.passport === undefined) {
      var destination = '/';
      socket.emit('not logged', destination);
    } else {
      console.log('user logged in');
      var userId = session.passport.user;
      var sql = 'SELECT * FROM users WHERE id = ?';
      var query = db.query(sql, userId, function (err, rows) {
        session.userdata = rows[0];
        session.save();
        var dataObj = session.userdata;
        socket.emit('sart up', dataObj);
      });
    }
  });

和jQuery:

// Connection Successful
socket.on('connect', function () {
  connected = true;
  socket.emit('login');
});

socket.on('disconnect', function () {
  connected = false;
});

socket.on('not logged', function (destination) {
  window.location.href = destination;
});

socket.on('start up', function (dataObj) {
});

我不是一个不得不这样做的忠实粉丝,我本来希望处理一切严重的问题,但是现在这是有效的,并且会一直使用,直到我弄清楚如何做到这一点方式我想。