Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express:内部服务器错误导致服务器停止_Javascript_Mysql_Node.js_Express - Fatal编程技术网

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

Javascript Express:内部服务器错误导致服务器停止,javascript,mysql,node.js,express,Javascript,Mysql,Node.js,Express,我的问题是,如果出现服务器错误,Express服务器将关闭。例如,如果express无法连接到数据库,则会出现错误: Error: connect ECONNREFUSED 127.0.0.1:3306 (..) 那么服务器就不再运行了。正如您在我的代码片段中看到的那样,我尝试使用来处理服务器错误。我希望即使出现错误,服务器也能继续运行 const express = require('express'); const methodOverride = require('method-ov

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

Error: connect ECONNREFUSED 127.0.0.1:3306 (..)
那么服务器就不再运行了。正如您在我的代码片段中看到的那样,我尝试使用来处理服务器错误。我希望即使出现错误,服务器也能继续运行

 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!');
 });

当您的
连接.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());
         }
    });
 });

嗯,是的。您没有有用的错误处理。如果没有捕获该异常的有用方法,您希望
throw err
做什么。在代码中为每一个可能出现错误的地方添加真正的错误处理。现在,如果无法连接到数据库,您可能只需向所有需要数据库的请求返回500个错误,但如果您正确处理连接错误,服务器可以保持正常状态。好的,因此我将我的
连接包装起来。query
函数在
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 breaked!');}
我的服务器无论如何都会停止。我想我缺少了一些东西,你不能在异步回调中使用try/catch。异步回调会在稍后发生。你必须在回调本身内部捕获异常。但是,在这种情况下,你甚至不需要抛出异常。你只需要决定在出现错误时做什么。可能是这样的
返回res.status(500)。发送(“数据库错误”)
。非常感谢!它成功了。如果您愿意,可以发布您的答案。我会将其标记为正确答案