node.js - 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并且效果很好
解决方案
推荐阅读
- mysql - 编写 MySQL 查询以获得测试表的预期结果
- android - 如何将 Kotlin Multiplatform Mobile 与 Amazon 放大服务集成?
- python - 键属性的 AttributeValue 不能包含空字符串值
- mysql - MYSQL如何去除重复项
- matlab - 有没有办法在 matlab 中输出类似于 LaTex 中的(符号)矩阵方程?
- prolog - 在 Prolog 中创建元变量
- c# - 以对象不为空为条件设置对象的属性
- javascript - 在jquery(javascript)中动态设置最大日期
- javascript - 我无法运行条件 IF
- angular - 将此错误作为在角度中使用 exportAs 'ngModel' 找到的没有指令