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

标签 javascript mysql node.js passport.js

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

问题:我现在的问题是,当我输入任何现有的凭据和电子邮件时,应用程序将挂起并拒绝将用户重定向到新页面。在我的浏览器底部,它会显示“正在等待本地主机...”。如果我将页面放置太久,最终会导致出现错误页面,并显示“此页面无法正常工作。本地主机未发送任何数据。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.' });
                           }
        })

关于javascript - Passport.js 使用 MySQL 和 Node.js 成功登录挂起,没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59132408/

相关文章:

javascript - 当其他事件发生时,用 javascript 隐藏的文本框变得可见

javascript - jquery 获取 <td> 中的下一个输入元素值

php - SaaS方式访问多个数据库和master数据库的用户认证机制

php - 连接 PHP 记录集中的符号

javascript - Save 不是 ExpressJS 中的函数

javascript - 将 NodeJS 与 Angular 集成的最佳方式

javascript - 如何从我的 HTML 嵌入视频重定向到另一个网页?

javascript - 语义 ui 下拉菜单在 react 中不起作用?

php - 使用日期和总和旋转 mysql 结果

node.js - 如何使用 key 获取数据