首页 文章

为什么sequelize在连接到express会话时返回500 [object SequelizeInstance:Users]?

提问于
浏览
0

问题:

我正在尝试使用护照本地策略对用户进行身份验证 . 我可以从数据库中成功检索用户,但是当我尝试重定向到'/'并启动新会话时,我的服务器响应500 [对象SequelizeInstance:Users]

背景:

我遇到了'connect-session-sequelize'节点包并在我的app.js中实现了它:

const db = require('./models/db.js');
const userController = require('./controllers/user');
const myStore = new SequelizeStore({
  db: db.sequelize,
  table: 'Sessions'
});

app.use(cookieParser());
app.use(session({
  secret: process.env.SESSION_SECRET,
  store: myStore,
  resave: false, // per the express-session docs this should be set to false
  proxy: true,
  saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

app.get('/login', userController.getLogin);
app.post('/login', userController.postLogin);
app.get('/signup', userController.getSignup);
app.post('/signup', userController.postSignup);

db.sequelize.sync({
  force: false,
}).then(() => {
  app.listen(app.get('port'), () => {
    console.log('%s App is running at http://localhost:%d in %s mode', chalk.green('✓'), app.get('port'), app.get('env'));
  });
});

我处理请求的路线:

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const db = require('../models/db.js');
const User = db.user;

passport.serializeUser((user, done) => {
  console.log('serializing user: ', user);
  done(null, user);
});

passport.deserializeUser((id, done) => {
  User.findById(id).then((user) => {
    done(user);
  });
});

passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
  User.findOne({
    where: { email: email.toLowerCase() },
  }).then((user) => {
    if (!user) {
      return done(null, false, { msg: `Email ${email} not found.` });
    }
    user.comparePassword(password, (err, isMatch) => {
      if (err) { return done(err); }
      if (isMatch) {
        return done(null, user);
      }
      return done(null, false, { msg: 'Invalid email or password.' });
    });
  });
}));

exports.postSignup = (req, res, next) => {
  const errors = req.validationErrors();
  const user = new User({
    username: req.body.name,
    email: req.body.email,
    password: req.body.password
  });

  User.findOne({
    where: { email: req.body.email }
  }).then((existingUser) => {
    if (existingUser) {
      req.flash('errors', { msg: 'Account with that email address already exists.' });
      return res.redirect('/signup');
    }
    user.save((err) => {
      req.logIn(user, (err) => {
        req.session.save(() => res.redirect('/'));
      });
    });
  });
};

'用户'数据库模型:

const bcrypt = require('bcrypt-nodejs');

module.exports = (sequelize, DataTypes) => {
  const Users = sequelize.define('Users', {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      primaryKey: true,
      allowNull: false,
      unique: true
    },
    username: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true
    },
    email: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true
    },
    password_hash: {
      type: DataTypes.STRING
    },
    password: {
      type: DataTypes.VIRTUAL,
      allowNull: false,
      unique: false,
      set(value) {
        const that = this;
        bcrypt.genSalt(10, (err, salt) => {
          if (err) { return console.log('BCRYPT GEN SALT ERR:', err); }

          bcrypt.hash(value, salt, null, (error, hash) => {
            if (error) { return console.log('BCRYPT HASH ERR:', err); }

            console.log('--> SEQ: BCRYPT hash SET', hash);
            that.setDataValue('password', value);
            that.setDataValue('password_hash', hash);
          });
        });
      }
    }
  });

  Users.prototype.comparePassword = function comparePassword(candidatePassword, cb) {
    bcrypt.compare(candidatePassword, this.password_hash, (err, isMatch) => {
      cb(err, isMatch);
    });
  };
  return Users;
};

'会话'数据库模型:

module.exports = (sequelize, DataTypes) => sequelize
  .define('Sessions', {
    sid: {
      type: DataTypes.STRING,
      primaryKey: true
    },
    userId: DataTypes.STRING,
    expires: DataTypes.DATE,
    data: DataTypes.STRING(50000),
  });

服务器响应:

POST /登录302 234.474 ms - 46执行(默认):SELECT“sid”,“userId”,“expires”,“data”,“createdAt”,“updatedAt”FROM“Sessions”AS“Sessions”WHERE“Sessions” . “sid”='Jhmo9YA9MhwKEVa6zWxvvRQGdYoXmdSQ';执行(默认):SELECT“id”,“username”,“email”,“password_hash”,“phone”,“age”,“gender”,“location”,“createdAt”,“updatedAt”FROM“Users”AS “用户”WHERE“用户” . “id”='c40d4cd6-4937-4a66-b785-d302e9fa6c40';执行(默认):UPDATE“Sessions”SET“expires”='2018-05-10 06:31:42.797 00:00',“updatedAt”='2018-05-09 06:31:42.797 00:00'在哪里“sid”='Jhmo9YA9MhwKEVa6zWxvvRQGdYoXmdSQ'[对象SequelizeInstance:用户] GET / 500 5.420 ms - -

1 回答

  • 0

    deserializeUser 应首先调用 done 并出现错误:

    passport.serializeUser((user, done) => {
      console.log('serializing user: ', user.id);
      done(null, user.id);
    });
    
    passport.deserializeUser((id, done) => {
      User.findById(id).then((user) => {
        done(null, user);
      }).catch(done);
    });
    

相关问题