【问题标题】:Express: Internal Server Error causes server to stopExpress:内部服务器错误导致服务器停止
【发布时间】:2017-03-02 04:46:10
【问题描述】:

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

Error: connect ECONNREFUSED 127.0.0.1:3306 (..)

然后服务器不再运行。正如您在我的代码 sn-p 中看到的那样,我尝试使用 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!');
 });

【问题讨论】:

  • 嗯,是的。您没有有用的错误处理。你期望throw err 在没有有用的方法来捕获该异常的情况下做什么。在代码中为每个可能出现错误的地方添加真正的错误处理。现在,如果您无法连接到数据库,您可能只需要向所有需要数据库的请求返回 500 个错误,但如果您正确处理连接错误,您的服务器可以保持正常运行。跨度>
  • 好的,所以我将我的 connection.query 函数包装在 try 中并像这样捕获:try{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()); }); }catch(err){ res.status(500).send('Something broke!'); } 我的服务器无论如何都会停止。我想我错过了什么
  • 您不能在异步回调周围使用 try/catch。异步回调会在稍后发生。您必须在回调本身内捕获异常。但是,在这种情况下,你甚至不需要扔它。您只需要决定在收到错误时该怎么做。可能类似于return res.status(500).send("database error")。
  • 非常感谢!有效。如果您愿意,您可以发布您的答案,我会将其标记为正确答案

标签: javascript mysql node.js express


【解决方案1】:

当您收到来自 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());
         }
    });
 });

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 2013-08-11
    • 2012-03-29
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多