Javascript Express:内部服务器错误导致服务器停止
我的问题是,如果出现服务器错误,Express服务器将关闭。例如,如果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
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)。发送(“数据库错误”)
。非常感谢!它成功了。如果您愿意,可以发布您的答案。我会将其标记为正确答案