Node.js с ошибкой подключения к базе данных exress handle за пределами промежуточного программного обеспечения

Я новичок в node, и я пытаюсь создать простую систему входа / регистрации с помощью passwordjs. У меня есть файл конфигурации паспорта, в котором я передаю объект паспорта в качестве параметра, как вы можете видеть ниже.

Мой файл конфигурации паспорта:

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

var User = require('./../models/user');

var mysql = require('./../database/mysql_setup');
var mysqlPool = mysql.pool;

// expose this function to our app using module.exports
module.exports = function(passport) {

    mysqlPool.getConnection(function(error, connection) {

        if (error) throw error;

        connection.query('USE vidyawxx_build2');

        // =========================================================================
        // passport session setup ==================================================
        // =========================================================================
        // required for persistent login sessions
        // passport needs ability to serialize and deserialize users out of session

        // used to serialize the user for the session
        passport.serializeUser(function(user, done) {
            done(null, user.username);
        });

        // used to deserialize the user
        passport.deserializeUser(function(username, done) {
            connection.query("SELECT * FROM `"+mysql.dbSpecs.prefix+"users` WHERE username = " + connection.escape(username), function(err,rows){
                done(err, rows[0]);
            });
        });


        // =========================================================================
        // LOCAL SIGNUP ============================================================
        // =========================================================================
        // we are using named strategies since we have one for login and one for signup
        // by default, if there was no name, it would just be called 'local'

        passport.use('local-signup', new LocalStrategy({
                // by default, local strategy uses username and password, we will override with email
                usernameField : 'username',
                passwordField : 'password',
                passReqToCallback : true // allows us to pass back the entire request to the callback
            },
            function(req, username, password, done) {

                // find a user whose username is the same as the forms username
                // we are checking to see if the user trying to login already exists
                connection.query("SELECT * FROM `"+mysql.dbSpecs.prefix+"users` WHERE `username` = "+connection.escape(username),function(err,rows){
                    if (err)
                        return done(err);
                    if (rows.length) {
                        return done(null, false, req.flash('error', 'This username is already in use.'));
                    } else {

                        // if there is no user with that username
                        // create the user
                        var newUserMysql = new User(username, password);

                        newUserMysql.generateHash(function(error, hash) {

                            if (error) {
                                return done(error);
                            }

                            var insertQuery = "INSERT INTO `"+mysql.dbSpecs.prefix+"users` ( username, password ) values (" + connection.escape(newUserMysql.username) +",'"+ hash +"')";

                            connection.query(insertQuery,function(err,rows){
                                if (err) {
                                    return done(error);
                                }
                                return done(null, rows);
                            });

                        });

                    }
                });
            }
        ));

        // =========================================================================
        // LOCAL LOGIN =============================================================
        // =========================================================================
        // we are using named strategies since we have one for login and one for signup
        // by default, if there was no name, it would just be called 'local'

        passport.use('local-login', new LocalStrategy({
                // by default, local strategy uses username and password
                usernameField : 'username',
                passwordField : 'password',
                passReqToCallback : true // allows us to pass back the entire request to the callback
            },
            function(req, username, password, done) { // callback with email and password from our form

                connection.query("SELECT * FROM `"+mysql.dbSpecs.prefix+"users` WHERE `username` = " + connection.escape(username), function(err,rows){

                    if (err) {
                        return done(err);
                    }
                    if (rows.length === 0) {
                        return done(null, false, req.flash('error', 'Oops! Wrong username or password.')); // req.flash is the way to set flashdata using connect-flash
                    }

                    // if the user is found but the password is wrong
                    var newUser = new User(username, password);
                    newUser.compareHash(function(error, result) {
                        if (result) {
                            return done(null, rows[0]);
                        } else {
                            return done(null, false, req.flash('error', 'Oops! Wrong username or password.')); // create the loginMessage and save it to session as flashdata
                        }
                    });

                });



            }
        ));

        connection.release();

    });
};

Моя проблема заключается в том, что если мой сервер mysql не работает по какой-либо причине, ошибка возникает в моей первой строке. Я хочу иметь возможность перенаправлять своих пользователей на простую страницу, которая дает ему сообщение типа «Что-то не так с базой данных, попробуйте позже». Дело в том, что когда я выдаю ошибку, мое приложение просто закрывается, давая любому посетителю ответ ERR_CONNECTION_REFUSED (в настоящее время я работаю над этим локально.

Это мой файл app.js:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var passport = require('passport');
var passportConfig = require('./config/passport');

var session = require("express-session");
var flash = require("connect-flash");

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();
app.use(express.static(path.join(__dirname, 'public')));

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());

passportConfig(passport);
app.use(session({
    secret: "aPa1fgOed(&fjkKLN34%#$lpv@@",
    resave: true,
    saveUninitialized: true,
    cookie: { maxAge: 1000*60*15 } //15 minutes in milliseconds
}));

app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

//create local vaariables for all our templates to use
app.use(function(req, res, next) {
    res.locals.errors = req.flash("error");
    res.locals.infos = req.flash("info");
    res.locals.successes = req.flash("success");
    next();
});

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

При этом, поскольку ошибка возникает в моем файле конфигурации паспорта, который не соответствует соглашению промежуточного программного обеспечения о наличии параметров req, res и next, как я могу изящно перенаправить своих пользователей на страницу, подобную упомянутой выше?

На всякий случай повторю еще раз, это касается только ошибок подключения mysql. Я знаю, что могу вернуть другие ошибки с помощью моих методов конфигурации паспорта, используя done (), но ошибки подключения к базе данных возникают вне функций с параметром done.

заранее спасибо

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
663
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, что после некоторых поисков единственный обходной путь, который я мог придумать, - это включение запросов в методы конфигурации паспорта, чтобы я мог передать любую ошибку соединения с базой данных через функцию done ();

Это мой измененный файл конфигурации паспорта.

// load all the things we need
var LocalStrategy   = require('passport-local').Strategy;

var User = require('./../models/user');

var mysql = require('./../database/mysql_setup');
var mysqlPool = mysql.pool;

// expose this function to our app using module.exports
module.exports = function(passport) {

    //connection.query('USE vidyawxx_build2');

    // =========================================================================
    // passport session setup ==================================================
    // =========================================================================
    // required for persistent login sessions
    // passport needs ability to serialize and deserialize users out of session

    // used to serialize the user for the session
    passport.serializeUser(function(user, done) {
        done(null, user.username);
    });

    // used to deserialize the user
    passport.deserializeUser(function(username, done) {
        mysqlPool.getConnection(function(dbError, connection) {

            if (dbError) {
                return done(dbError);
            }

            connection.query("SELECT * FROM `"+mysql.dbSpecs.prefix+"users` WHERE username = " + connection.escape(username), function(err,rows){
                if (err) {
                    done(err);
                    connection.release();
                    return;
                }
                connection.release();
                done(err, rows[0]);
            });
        });
    });


    // =========================================================================
    // LOCAL SIGNUP ============================================================
    // =========================================================================
    // we are using named strategies since we have one for login and one for signup
    // by default, if there was no name, it would just be called 'local'

    passport.use('local-signup', new LocalStrategy({
            // by default, local strategy uses username and password, we will override with email
            usernameField : 'username',
            passwordField : 'password',
            passReqToCallback : true // allows us to pass back the entire request to the callback
        },
        function(req, username, password, done) {

            // find a user whose username is the same as the forms username
            // we are checking to see if the user trying to login already exists
            mysqlPool.getConnection(function(dbError, connection) {

                if (dbError) {
                    return done(dbError);
                }

                connection.query("SELECT * FROM `"+mysql.dbSpecs.prefix+"users` WHERE `username` = "+connection.escape(username),function(err,rows){

                    if (err) {
                        connection.release();
                        return done(err);
                    }

                    if (rows.length) {
                        connection.release();
                        return done(null, false, req.flash('error', 'This username is already in use.'));
                    } else {

                        // if there is no user with that username
                        // create the user
                        var newUserMysql = new User(username, password);

                        newUserMysql.generateHash(function(error, hash) {

                            if (error) {
                                connection.release();
                                return done(error);
                            }

                            var insertQuery = "INSERT INTO `"+mysql.dbSpecs.prefix+"users` ( username, password ) values (" + connection.escape(newUserMysql.username) +",'"+ hash +"')";

                            mysqlPool.query(insertQuery,function(err,rows){
                                if (err) {
                                    connection.release();
                                    return done(error);
                                }
                                connection.release();
                                return done(null, rows);
                            });

                        });

                    }
                    connection.release();
                });

            });
        }
    ));

    // =========================================================================
    // LOCAL LOGIN =============================================================
    // =========================================================================
    // we are using named strategies since we have one for login and one for signup
    // by default, if there was no name, it would just be called 'local'

    passport.use('local-login', new LocalStrategy({
            // by default, local strategy uses username and password
            usernameField : 'username',
            passwordField : 'password',
            passReqToCallback : true // allows us to pass back the entire request to the callback
        },
        function(req, username, password, done) { // callback with email and password from our form

            mysqlPool.getConnection(function(dbError, connection) {
                if (dbError) {
                    return done(dbError);
                }
                connection.query("SELECT * FROM `"+mysql.dbSpecs.prefix+"users` WHERE `username` = " + connection.escape(username), function(err,rows){

                    if (err) {
                        connection.release();
                        return done(err);
                    }
                    if (rows.length === 0) {
                        connection.release();
                        return done(null, false, req.flash('error', 'Oops! Wrong username or password.')); // req.flash is the way to set flashdata using connect-flash
                    }

                    // if the user is found but the password is wrong
                    var newUser = new User(username, password);
                    newUser.compareHash(function(error, result) {
                        if (result) {
                            connection.release();
                            return done(null, rows[0]);
                        } else {
                            connection.release();
                            return done(null, false, req.flash('error', 'Oops! Wrong username or password.')); // create the loginMessage and save it to session as flashdata
                        }
                    });

                });
            });
        }
    ));


};

Другие вопросы по теме