Express:内部服务器错误导致服务器停止

时间:2017-03-01 20:23:04

标签: javascript mysql node.js express

我的问题是,如果我收到服务器错误,Express-Server会关闭。例如,如果express无法连接到数据库,则会收到错误:

Error: connect ECONNREFUSED 127.0.0.1:3306 (..)

然后服务器不再运行了。我尝试使用this guide处理我的服务器错误,您可以在我的代码段中看到。我希望服务器即使在出现错误时也能继续。

 const express = require('express');
 const methodOverride = require('method-override');
 const app = express();
 const mysql = require('mysql');
 const connection = mysql.createConnection({
     host     : 'localhost',
     user     : 'XXX',
     password : 'XXX'
 });
 app.use(methodOverride());
 app.use(function(err, req, res, next) {
     res.status(500);
     // res.render('error', { error: err });
     res.status(500).send('Something broke!');
 });


 /*Webservices: */
 app.get('/', function (req, res) {
     res.send('Hello World!');
 });

 app.get('/database', function (req, res) {
         connection.query('SELECT 2 AS solution', function (err, rows, fields) {
             if (err) throw err;
             console.log('The solution is: ', rows[0].solution);
             res.send(rows[0].solution.toString());
         });
 });


 /*Start Server: */
 app.listen(3000, function () {
     console.log('Example app listening on port 3000!');
 });

1 个答案:

答案 0 :(得分:0)

当您从connection.query()收到错误时,您将抛出未处理的异常。保持服务器运行的关键是妥善处理可能发生的所有错误,并确保在出现错误时安全(对于您的服务器)安全。

在这种情况下,由于这是在异步回调中,因此唯一可以安全处理该错误的地方就是回调本身。您不能抛出异常并在普通的异步回调中将其捕获到更高级别。

所以,我建议这样的事情:

app.get('/database', function (req, res) {
    connection.query('SELECT 2 AS solution', function (err, rows, fields) {
         if (err) {
             res.status(501).send("database query error");
         } else {
             console.log('The solution is: ', rows[0].solution);
             res.send(rows[0].solution.toString());
         }
    });
 });