首页 > 解决方案 > passeportjs 出错并在 express 应用上续集

问题描述

我有一个问题,我找不到类似的帖子来解决我的问题,我想走一条路线,我有一条消息“无法读取未定义的属性'findOne'”但我的模型很好并且有效,我有在文件中使用 findall() 进行了测试并且可以工作....

我在后端使用 express、sequelize 和 passeport.js

预先感谢您的帮助

const { User } = require('../models')
const LocalStrategy = require('passport-local').Strategy
const passport = require('passport')
const bcrypt = require('bcrypt')

const verifPass = (password, user) => {
    return bcrypt.compareSync(password, user.user_password)
}

passport.serializeUser((user, done) => {
    done(null, user.user_email)
})

passport.deserializeUser((email, done) => {
    User.findOne({where: {user_email: email}}).then(user => {
        done(null, user)
    }).catch(err => {
        done(err, null)
    })
})

passport.use(new LocalStrategy(
    function(email, password, done) {
        User.findOne({where: {user_email: email}}).then(user => {
            if (!user){
                return done(null, false)
            }

            if (!verifPass(password, user)){
                return done(null, false)
            }

            return done(null, user)

        }).catch(err => {
            return done(err, null)
        })
    }
));

module.exports = passport

用户模型

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */


    static associate({ Role, Role_User }) {
      // define association here
      this.belongsTo(Role, {foreignKey: "user_role_id" })
    }
  };


  User.init({
    user_name: {
      type: DataTypes.STRING,
      allowNull: false
    },
    user_surname: {
      type: DataTypes.STRING,
      allowNull: false
    },
    user_phone: {
      type: DataTypes.STRING,
      allowNull: false
    },
    user_email: {
      type: DataTypes.STRING,
      unique: true,
      allowNull: false,
      validate: {
        isEmail: true
      }
    },
    user_last_connection: {
      type: DataTypes.DATE,
      allowNull: false
    },
    user_password: {
      type: DataTypes.STRING,
      allowNull: false
    },
    user_function: {
      type: DataTypes.STRING,
      allowNull: true
    },
    user_data_hiring: {
      type: DataTypes.DATE,
      allowNull: true
    },
    user_data_departure: {
      type: DataTypes.STRING,
      allowNull: true
    },
    user_notes: {
      type: DataTypes.STRING,
      allowNull: true
    },
    user_role_id: {
      type: DataTypes.STRING,
      allowNull: false,
      references: {
        model: "Roles",
        key: "id"
      }
    },
    isDeleted: {
      type: DataTypes.BOOLEAN,
      allowNull: false,
    }
  }, {
    sequelize,
    modelName: 'User',


  }, );


  return User;
};

错误日志

-------------------编辑------------------

通过在 passport.use 之外创建方法修复第一条错误消息

    const findUser = async (email) => {
        return await User.findOne({where: {user_email: email}})
    }


    passport.use(new LocalStrategy.Strategy({
        usernameField: 'email',
        passwordField: 'password'
    }, async (email, password, done) => {
        try {
            const user = await findUser(email)
            console.log(user)
            if (user && verifPass(password, user)){
                done(null, user)
            }else{
                done(null, false)
            }
        }catch (error) {
            done(error)
        }
    }))

但现在另一个未知功能... 记录错误 2

我真的不明白在文档中这样发生是没有意义的。

登录控制器:

router.post('/',
    passport.authenticate('local'),
    function(req, res) {
        // If this function gets called, authentication was successful.
        // `req.user` contains the authenticated user.
        res.json(req.user)
    });

-------------------解决方案-----------------

几个小时后,我发现保存会话实际上是一个明智的依赖,导致问题:https ://www.npmjs.com/package/connect-session-sequelize

我将其替换为:https://www.npmjs.com/package/express-mysql-session并且效果很好

标签: node.jsexpresssequelize.jspassport.jspassport-local

解决方案


推荐阅读