Javascript 使用Sequelize模型静态方法创建身份验证系统的问题
我正在尝试为我的实践项目设置登录系统 在身份验证路由器下,有用于登录和注册的get-post方法 我面临的问题是我使用了“模型定义”,后来发现静态方法不能作为选项使用 所以我阅读了API,并切换到基于类的模型,在这里我设置了类静态方法,以便可以在控制器的其他地方使用该方法 我试图实现的是通过比较bcrypt-和来自前端的用户输入密码来验证用户 这将作为“POST”请求提交,我在其中运行singin控制器,该控制器利用用户模型中的“登录”方法。(这是我比较数据库中散列密码和用户输入的地方) 我得到一个错误,其中一个输入值没有定义。我到处找,看我是否犯了错误,但运气不好 这是我收到的错误消息 我不理解这一点,因为我输入的电子邮件变量在console.log上完全有效。我还认为在使用函数时出现了错误,但经过一些研究后,我并不认为这是一个问题 请告知。 此外,如果您有更好的处理方法的建议,请提供建议 下面是我的模型代码Javascript 使用Sequelize模型静态方法创建身份验证系统的问题,javascript,node.js,express,sequelize.js,Javascript,Node.js,Express,Sequelize.js,我正在尝试为我的实践项目设置登录系统 在身份验证路由器下,有用于登录和注册的get-post方法 我面临的问题是我使用了“模型定义”,后来发现静态方法不能作为选项使用 所以我阅读了API,并切换到基于类的模型,在这里我设置了类静态方法,以便可以在控制器的其他地方使用该方法 我试图实现的是通过比较bcrypt-和来自前端的用户输入密码来验证用户 这将作为“POST”请求提交,我在其中运行singin控制器,该控制器利用用户模型中的“登录”方法。(这是我比较数据库中散列密码和用户输入的地方) 我得到
const { Sequelize, DataTypes, Model } = require('sequelize');
const db = require('../config/dbConfig');
const bcrypt = require('bcryptjs');
const sequelize = new Sequelize('postgres::log_us_in'); //assuming this is database name.
class User extends Model {
static async login(email, password) {
const user = await this.findOne({ where: { email: email } });
if (user) {
if (bcrypt.compare(password, user.password)) {
return user;
}
throw Error('Incorrect password');
}
throw Error('Incorrect email');
}
}
User.init(
{
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true,
},
},
password: {
type: DataTypes.STRING,
allowNull: false,
},
name: {
type: DataTypes.STRING,
},
gender: {
type: DataTypes.STRING,
},
twitter: {
type: DataTypes.STRING,
},
instagram: {
type: DataTypes.STRING,
},
about: {
type: DataTypes.TEXT,
},
interests: {
type: DataTypes.ARRAY(DataTypes.STRING),
},
},
{
sequelize,
modelName: 'users',
timestamps: true,
hooks: {
beforeSave: async (user, _) => {
const salt = await bcrypt.genSalt();
user.password = await bcrypt.hash(user.password, salt);
},
},
}
);
module.exports = User;
下面是它实例化模型并使用其方法的控制器
const User = require('../models/User');
const jwt = require('jsonwebtoken');
require('dotenv').config();
console.log(User.login());
//Helpers
const handleErrors = (e) => {
const errors = e.errors.map((error) => {
return { message: error.message, type: error.type, path: error.path };
});
return errors[0];
};
const maxAge = 3 * 24 * 60 * 60; // in seconds hence multiply it by 1000
const createToken = (id) => {
return jwt.sign({ id }, process.env.JWT_PRIVATE_KEY, {
expiresIn: maxAge,
});
};
//Handle register
module.exports.register_get = (req, res) => {
console.log('-------register_get--------', req.body);
res.send('llll');
};
module.exports.register_post = async (req, res) => {
const { email, password, name, gender, social, about, interests } = req.body;
try {
const user = await User.create({
email,
password,
name,
gender,
twitter: social.twitter,
instagram: social.instagram,
about,
interests,
});
const token = createToken(user.id);
res
.cookie('jwt', token, { httpOnly: true, maxAge: maxAge * 1000 })
.status(200)
.send();
} catch (e) {
res.status(400).send(handleErrors(e));
}
};
//Handle Signin
module.exports.signin_get = (req, res) => {
res.send('signup');
};
module.exports.signin_post = async (req, res) => {
const { email, password } = req.body;
try {
const user = await User.login(email, password);
res.status(200).send({ user: user.id });
} catch (e) {
console.log(e);
res.status(400).send({});
}
};