0

I have a NodeJS application with Express as framework. In my app.js file I'm checking my connection to mysql database as below:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mysql = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '',
  database : 'nodejs'
});

var routes = require('./routes/index');

var app = express();

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

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);

// catch Database connection errors and forward to error handler
app.use(function(req, res, next) {
    connection.connect(function(err){
        if(err){
            var err = new Error('Database connection error! Try later please.');
            err.status = 503;
            next(err);    
        }
    });
});

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});


module.exports = app;

The part of the code that I'm expecting to work is this :

// catch Database connection errors and forward to error handler
app.use(function(req, res, next) {
    connection.connect(function(err){
        if(err){
            var err = new Error('Database connection error! Try later please.');
            err.status = 503;
            next(err);    
        }
    });
});

routes/index.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
    res.render('index');
});

module.exports = router;

When I run my server with a wrong password, nothing happenes the page is served, here is my log:

GET / 304 17.940 ms - -
GET /vendors/bootstrap/dist/css/bootstrap.min.css 304 2.915 ms - -

Any help how to display an error page when a DB error (connection or bad query) occures?

Thanks

Thanks

oussama kamal
  • 1,027
  • 2
  • 20
  • 44

1 Answers1

1

This is really poor, why would you to want to call the middleware every time to check for connection for each request?

app.use(function(req, res, next) {
    connection.connect(function(err){
        if(err){
            var err = new Error('Database connection error! Try later please.');
            err.status = 503;
            next(err);    
        }
    });
});

Instead you can use to log errors when ever something wrong happens with your code. This will catch all errors.

router.use(function (err, req, res, next) {  
    /* log the error internaly */
    logger.error(err);
    res.status(err.statusCode || 500).json(err);
});

Below are some link which you can help you further:

  1. http://expressjs.com/en/guide/database-integration.html
  2. http://expressjs.com/en/guide/error-handling.html

On the error for 304, try this in your dev console and see if it works: Disabling Chrome cache for website development

Update:

Your db connection: db.js

var mysql      = require('mysql');
var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '',
    database : 'nodejs'
});

connection.connect(function(err) {
    if (err) {
    console.error('error connecting: ' + err.stack);
    return;
}});

module.exports = connection;

Now your index.js

var express = require('express'),
    app = express(),
    db = require('./db');

app.get('/',function(req,res){
    var query = db.query('Select * from your table', function(err, result) {
    if (err) throw err;
    });
});

server.listen(3000);

Now when the error happens, you get the error message and code, with that in your middleware you can throw them to a view in public/databaseError.html

Community
  • 1
  • 1
Thalaivar
  • 23,282
  • 5
  • 60
  • 71
  • Sounds like no one is understanding my question. I would like in NodeJs + express + mysql-node to check if the database is working because all my site relies on DB queries so that if the DB is not working I want to render only one view saying DB error, all the rest views should not render – oussama kamal Jun 12 '16 at 12:21