2016-06-12 88 views
0

我有一個以Express作爲框架的NodeJS應用程序。 在我的app.js文件我檢查我的MySQL數據庫,如下連接:mysql重定向到錯誤頁面,使用Express框架的NodeJS

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頁面被解僱了?這樣就可以達到有關DB的部分代碼。 –

+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

更新:

您的數據庫連接: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發生時,你得到的errormessagecode,與你middleware你可以把它們扔到public/databaseError.html

+0

聽起來像沒有人理解我的問題。我想在NodeJs + express + mysql-node檢查數據庫是否正常工作,因爲我的所有站點都依賴於數據庫查詢,因此如果數據庫不工作,我只想渲染一個視圖說數據庫錯誤,所有其餘視圖應該不渲染 –