首页 > 解决方案 > NodeJS:注册用户后自动登录

问题描述

我在注册后尝试登录用户,但出现以下错误:

错误:无法将用户序列化到会话中

这是我的注册方法:

register(req, res, next) {

    const errors = validationResult(req);

    if (!errors.isEmpty()) {
        req.flash('errors', errors.array({
            onlyFirstError: true
        }));
        res.redirect('back');
    } else {

        const SQL = `SELECT email FROM users WHERE email = ${pool.escape(req.body.email)}`;

        pool.query(SQL, (err, result) => {
            if (result.length !== 0) {
                req.flash('error_message', 'El email ofrecido ya está registrado. Vuelva a intentarlo.');
                res.redirect('back');
            } else {
                const sql = 'INSERT INTO contact_app.users (username, email, password) VALUES (?, ?, ?)';

                pool.query(sql, [req.body.username, req.body.email, Hash.encryptPass(req.body.password)],
                    (err) => {
                        if (err) {
                            console.error(err);
                        } else {
                            console.log('User registered correctly.');
                        }
                    });

                initPassport();

                req.login([req.body.email, req.body.password], (err) => {
                    if (err) {
                        return next(err);
                    } else {
                        res.redirect('/perfil');
                    }
                });

            }
        });
    }
}

感谢我的passport.js文件有错误,但是当我想正常登录时,它工作得很好。这是我的passport.js:

import passport from 'passport';
import { Strategy } from 'passport-local';
import pool from '../database/db';
import bcrypt from '../lib/bcrypt';

const initPassport = () => passport.use('local', new Strategy({

    usernameField: 'email',
    passwordField: 'password',


}, (username, password, done) => {
    const sql = 'SELECT * FROM users where email = ?';
    pool.query(sql, [username], (err, result) => {
        if (err) {
            console.log(err);
        } else {

            if (result.length > 0) {
                const user = result[0];
                const validPassword = bcrypt.matchPass(password, user.password);

                if (validPassword) {
                    return done(null, user);
                } else {
                    return done(null, false);
                }

            } else {
                return done(null, false);
            }

        }
    });
}));

passport.serializeUser((user, done) => {
    return done(null, user.id);
});

passport.deserializeUser((id, done) => {
    pool.query('SELECT * FROM users WHERE id = ?', [id], (err, result) => {
        if (err) {
            console.log(err);
        } else {
            if (result.length > 0) {
                return done(null, result[0]);
            } else {
                return done(null, false);
            }
        }
    });
});

export default initPassport;

我不确定在 req.login 方法中是否必须输入我注册的整个用户,或者只有电子邮件和密码才能与护照字段匹配。

提前致谢!

标签: javascriptnode.jsexpresspassport.jspassport-local

解决方案


推荐阅读