繁体   English   中英

Passport.js 使用 MySQL 和 Node.js 成功登录挂起而没有错误

[英]Passport.js Successful Login hangs without error using MySQL and Node.js

我正在尝试创建一个利用注册和登录功能的应用程序。 我已经完成了所有信息(电子邮件和密码)成功传递并保存到 MySQL 数据库中的注册部分。

问题:我现在的问题是,当我输入任何现有的凭据和电子邮件时,应用程序将挂起并拒绝将用户重定向到新页面。 在我的浏览器底部,它会说“正在等待 localhost...”。 如果我将页面放置太长时间,它最终会导致一个错误页面,上面写着“这个页面不起作用。本地主机没有发送任何数据。ERR_EMPTY_RESPONSE”。

我尝试控制台记录任何错误,但无法确定任何原因/错误。 我确实确保我输入的信息正确地与数据库表中的值进行了比较,并且重定向到页面的功能正在运行。 我也尝试以多种方式重写我的代码,但最终遇到了同样的问题。

下面是我的passport.js文件:

var LocalStrategy = require('passport-local').Strategy;

// Load User model
const User = require('../models/User');

// Reference: http://www.passportjs.org/docs/
module.exports = function (passport) {
    passport.use(
        new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
            // Match user
            User.findOne({ which: { email: email } })
                .then(user => {
                    // Check if Email exists in database
                    if (!user) {
                        return done(null, false, {
                            message: "Email is not registered."
                        });
                    }

                    // Check if password matches the one found in the database (To Do: Encrypt this later!)
                    if (password != user.password) {
                        return done(null, false, { message: 'Password is incorrect.' });
                    } else {
                        return done(null, user);
                    }
                })
                .catch(err => console.log(err));
        })
    );

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

    passport.deserializeUser(function (id, done) {
        // Find by Primary Key
        User.findByPk(id, function (err, user) {
            console.log(user);
            done(err, user);
        });
    });
}

下面是我的app.js (服务器)文件:

var express = require('express')
var expressLayouts = require('express-ejs-layouts');
var flash = require('connect-flash');
var session = require('express-session');
var passport = require('passport');

var app = express();

// Embedded JavaScript (EJS)
app.use(expressLayouts);
app.set('view engine', 'ejs');

// Express Session
app.use(session({
    secret: 'secret',
    resave: false,
    saveUninitialized: false
}));

// Bodyparser 
app.use(express.urlencoded({ extended: false }));

// Passport
app.use(passport.initialize());
app.use(passport.session());
require('./config/passport')(passport);

// Connect flash for notification messages
app.use(flash());

// Global Variables to define specific notification messages
app.use((req, res, next) => {
    // Notification for Registration Page
    res.locals.success_msg = req.flash('success_msg')
    res.locals.error_msg = req.flash('error_msg');

    // Notification for Passport Login Verification
    res.locals.error = req.flash('error');
    next();
});

// Routes
app.use('/', require('./routes/index'));

// Login/Register Endpoints routes (ex. /users/login)
app.use('/users', require('./routes/users'));

// Image
//app.use(express.static('./public'));

var port = process.env.PORT || 8026;

app.listen(port);
console.log('Server Running');
console.log("Port: " + port);

下面是我处理登录和重定向的函数

router.post('/login', (req, res, next) => {
    console.log(req.body);
    passport.authenticate('local', {
        successRedirect: '/dashboard',
        failureRedirect: '/users/login',
        failureFlash: true
    })(req, res, next);
});

如果您需要任何其他信息,请告诉我。 谢谢!

我认为这可能是一个问题。 passport.use ,如果发生错误,您不会返回任何内容。

passport.use(
        new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
            // Match user
            User.findOne({ which: { email: email } })
                .then(user => {
                    // Check if Email exists in database
                    if (!user) {
                        return done(null, false, {
                            message: "Email is not registered."
                        });
                    }

                    // Check if password matches the one found in the database (To Do: Encrypt this later!)
                    if (password != user.password) {
                        return done(null, false, { message: 'Password is incorrect.' });
                    } else {
                        return done(null, user);
                    }
                })
                .catch(err =>{
                           console.log(err));
                           return done(null, false, { message: 'Internal Server error.' });
                           }
        })

修复了悬挂问题。 我编写passport.js的方式确实有问题,因为代码更适用于MongoDB 而不是MySQL。

这是新的工作passport.js

module.exports = function(passport) {
    passport.serializeUser(function(user, done) {
        done(null, user.id);
    });

    passport.deserializeUser(function(id, done) {
        connection.query("select * from users where id = "+id,function(err,rows){   
            done(err, rows[0]);
        });
    });

    passport.use(new LocalStrategy({
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows pass back of entire request to the callback
    },
    function(req, email, password, done) { // callback with email and password from form
         // Match User
         connection.query("SELECT * FROM `users` WHERE `email` = '" + email + "'",function(err,rows){
            if (err)
                return done(err);
             // Check if Email exists in database
             if (!rows.length) {
                return done(null, false, { message: 'Email is not registered' }); 
            } 

            // Check if password matches the one found in the database (To Do: Encrypt this later!)
            if (!( rows[0].password == password))
                return done(null, false, { message: 'Password is incorrect.' });

            // All is well, return successful user
            return done(null, rows[0]);         
        });
    }));
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM