2016-06-12 3 views
0

У меня есть приложение NodeJS с Express как фреймворк. В моих app.js файл я проверяю мое подключение к базе данных MySQL, как показано ниже:mysql перенаправить на страницу с ошибкой, NodeJS с фреймворком Express

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; 

часть кода, который я ожидал, чтобы работать это:

// 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);  
     } 
    }); 
}); 

маршруты/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; 

Когда я запускаю мой сервер с неправильным паролем, ничего не сложилось, страница служил, вот мой журнал:

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

Любая помощь в том, как отображать страницу с ошибкой при возникновении ошибки БД (соединение или плохой запрос)?

Благодаря

Благодаря

+0

потому что я думаю, ваш код никогда не доходит до ошибок базы данных. Поделитесь логикой маршрута '/.' –

+0

Я не думаю, что вы указали причину, почему страница 404 уволена, когда маршрут отсутствует? так что часть кода о БД, на мой взгляд, достигнута. –

+0

Ошибка '404', поэтому' 304' означает, что он загружен правильно. –

ответ

1

Это действительно плохое, то почему бы вам хочет называть middleware каждый раз для проверки connection для каждого 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);  
     } 
    }); 
}); 

Вместо этого вы можете использовать для регистрации ошибок, когда что-то происходит с вашим кодом. Это будет catch все errors.

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

Ниже приведены некоторые звено, которое вы можете помочь Вам:

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

Об ошибке на 304, попробуйте это в консоли разработчика и посмотреть, если он работает: Disabling Chrome cache for website development

Update:

Ваше дб соединение: 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; 

Теперь ваш 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); 

Теперь, когда error происходит, вы получите errormessage и code с, что в вашей middleware вы можете бросить их на вид в public/databaseError.html

+0

Похоже, никто не понимает мой вопрос. Я бы хотел, чтобы в NodeJs + express + mysql-node проверял, работает ли база данных, потому что весь мой сайт использует запросы БД, так что если БД не работает, я хочу отобразить только один вид, говорящий о ошибке БД, все остальные представления должны не делать –

Смежные вопросы