【发布时间】: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