代码之家  ›  专栏  ›  技术社区  ›  William

切换到基于承诺的数据库,现在我的登录完全被破坏

  •  0
  • William  · 技术社区  · 8 年前

    我可以很好地注册,但是当我被引导到我的游戏路径时,我会得到一个默认的错误页面,它只是白色的 [object Object] [对象对象]

    起初我以为这和socket.io有关,但还没到那个地步。我想这可能是一些护照和我如何配置它的东西,没有设置好我要去的承诺路线,但我完全失去了。我不知道这个错误到底发生在哪里。

    这是护照文件:

    /*jshint esversion: 6 */
    const LocalStrategy = require('passport-local').Strategy;
    const db = require('../config/db');
    const bcrypt = require('bcryptjs');
    let io = require('./io');
    
    module.exports = (passport) => {
    
      // Local Strategy login
      passport.use('local-login', 
      new LocalStrategy((username, password, done) => {
        console.log('username');
        // Match Username
        let sql = 'SELECT * FROM users WHERE username = ?';
        db.query(sql, [username]).then(results => {
          if (!results.length) {
            return done(null, false, {
              type: 'loginMessage',
              message: 'Wrong Login',
            });
          }
          console.log('password');
          //  Match Password
          bcrypt.compare(password, results[0].password, (err, isMatch) => {
            if (isMatch) {
              console.log('Password is correct');
              return done(null, results[0]);
            } else {
              return done(null, false, {
                type: 'loginMessage',
                message: 'Wrong Login',
              });
            }
          });
        });
      }));
    
      // =========================================================================
      // passport session setup ==================================================
      // =========================================================================
    
      // used to serialize the user for the session
      passport.serializeUser((user, done) => {
        console.log(user.username + ' has been Serialized');
        done(null, user.id);
      });
    
      // used to deserialize the user
      passport.deserializeUser((id, done) => {
        db.query('SELECT * FROM users WHERE id = ?', [id]).then(results => {
          console.log(results[0].username + ' has been deserialized');
          done(results[0]);
        });
      });
    };
    

    这似乎是顺利完成的,下面是我的登录重定向:

    // Login Process
    router.post('/login',
    passport.authenticate('local-login', {
        successRedirect: '/game',
        failureRedirect: '/',
        failureFlash: true,
      }), (req, res) => {
        console.log('login route test');
      });
    

    // Passport config
    require('./config/passport')(passport);
    
    app.use(passport.initialize());
    app.use(passport.session());
    app.get('*', function (req, res, next) {
      res.locals.user = req.user || null;
      next();
    });
    

    然后游戏路线:

    //Route to game app
    app.get('/game', function (req, res) {
      console.log('Log before it checks req.user');
      if (req.user) {
        console.log('req.user is working');
        res.render('game');
      } else {
        req.flash('error', 'You need to be signed in!');
        res.redirect('/');
      }
    });
    

    所以这里的问题是:当我没有登录到 /game 路线它将踢回我的主要路线与正确的闪光错误。但是,当我登录时,我不能让它在我的生命中 console.log() req.user 登录时,但我不知道为什么,也不知道如何登录。如果需要更多的信息,我可以给更多。。。但这主要是所有人处理登录过程的方式(除了socket.io,但它甚至还没有到达那个点,而我的socket.io文件所做的只是发送数据客户端以便于更新)。

    我会继续尝试我的运气,但由于我是新的承诺,这可能是原因,如果它是,我可能不会这么幸运。

    编辑:而且,我在浏览器控制台上收到一个500内部服务器错误。

    编辑:更新了代码并在更多的地方添加了console.logs以查看挂断的位置,我仍然不确定。下面是我单击login按钮时的日志记录顺序:

    username
    password
    Password is correct
    Bloodmorphed has been Serialized
    Bloodmorphed has been deserialized
    [object Object]
    Bloodmorphed has been deserialized
    [object Object]
    

    编辑:所以看起来登录过程没有正常工作。我不知道为什么,我做什么都找不到问题。我已经研究了如何为MySQL设置passport的多个来源,虽然其中一些来源略有不同,但它们在重要的地方似乎都是相同的。我不知道这是为什么发生的,根据多个来源的工作登录,我这样做是正确的。

    1 回复  |  直到 8 年前
        1
  •  1
  •   William    8 年前

    我是,嗯。。。简直是个白痴。我忘记了当我切换到promise系统时,我处理查询本身的错误,所以没有理由传递它。

    所以我在哪里做的 done(results[0]) passport.deserializeUser... done(null, results[0]) 在一件简单的事情上浪费了那么多时间。我觉得自己像个傻瓜。