2016-06-12 1 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; 

私が間違ったパスワードで自分のサーバーを実行すると、何もページが提供されhappenesない、ここに私のログは次のとおりです。

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

DBエラー(接続や不正なクエリ)が発生したときにエラーページを表示する方法はありますか?

おかげ

おかげ

+0

私の考えでは、あなたのコードは決してデータベースエラーには達しません。ルート '/'の論理を共有する。 –

+0

私はあなたが指摘したとは思わないが、ルートが見つからないときに404ページがなぜ解雇されるのか?私が思うようなDBについてのコードの一部に到達します。 –

+0

「404」エラーはありません。正しくロードされたことを意味する「304」です。 –

答えて

1

これは本当に悪い、なぜあなたは、各requestためconnectionを確認するために毎回middlewareを呼び出すしたいのでしょうか?

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のエラーでは、あなたのdevのコンソールでこれを試してみてどうかを確認それは動作します: Disabling Chrome cache for website development

更新:

あなたのDB接続: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が発生したとき、あなたはあなたのmiddlewareでそれと、errormessagecodeを取得あなたはビューにそれらを投げることができますpublic/databaseError.html

+0

誰も好きではないような音が私の質問を理解しています。私はNodeJs + express + mysql-nodeでデータベースが動作しているかどうかを確認するために、すべてのサイトがDBクエリに依存しているので、DBが動作していないとDBエラーを表示するビューが1つだけレンダリングされます。レンダリングしない –

関連する問題