Javascript 使用Sequelize模型静态方法创建身份验证系统的问题

Javascript 使用Sequelize模型静态方法创建身份验证系统的问题,javascript,node.js,express,sequelize.js,Javascript,Node.js,Express,Sequelize.js,我正在尝试为我的实践项目设置登录系统 在身份验证路由器下,有用于登录和注册的get-post方法 我面临的问题是我使用了“模型定义”,后来发现静态方法不能作为选项使用 所以我阅读了API,并切换到基于类的模型,在这里我设置了类静态方法,以便可以在控制器的其他地方使用该方法 我试图实现的是通过比较bcrypt-和来自前端的用户输入密码来验证用户 这将作为“POST”请求提交,我在其中运行singin控制器,该控制器利用用户模型中的“登录”方法。(这是我比较数据库中散列密码和用户输入的地方) 我得到

我正在尝试为我的实践项目设置登录系统

在身份验证路由器下,有用于登录和注册的get-post方法

我面临的问题是我使用了“模型定义”,后来发现静态方法不能作为选项使用

所以我阅读了API,并切换到基于类的模型,在这里我设置了类静态方法,以便可以在控制器的其他地方使用该方法

我试图实现的是通过比较bcrypt-和来自前端的用户输入密码来验证用户

这将作为“POST”请求提交,我在其中运行singin控制器,该控制器利用用户模型中的“登录”方法。(这是我比较数据库中散列密码和用户输入的地方)

我得到一个错误,其中一个输入值没有定义。我到处找,看我是否犯了错误,但运气不好

这是我收到的错误消息

我不理解这一点,因为我输入的电子邮件变量在console.log上完全有效。我还认为在使用函数时出现了错误,但经过一些研究后,我并不认为这是一个问题

请告知。 此外,如果您有更好的处理方法的建议,请提供建议

下面是我的模型代码

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({});
    }
};