簡體   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