我正在将Express与async/await
一起使用。当async
函数被拒绝时,将引发异常。
但是,客户不会收到他的请求的答复,这使他悬而未决。
如何为未处理的运行时异常添加全局异常处理程序?在这种情况下,服务器应以状态代码"Server Error"
500
答复。
try
和catch
包住我所有的服务器端功能next(err);
)这是我的示例快递应用程序:
const express = require('express');
const app = express();
const port = 8080;
async function validate() {
let shouldFail = Math.random() >= 0.5;
if (shouldFail) {
throw new Error();
}
}
app.get('/', async (req, res) => {
await validate();
res.json({"foo": "bar"});
});
app.listen(port, () => console.log(`listening on port ${port}!`));
注意-http函数将随机失败。只是出于演示目的。
答案 0 :(得分:1)
开箱即用的express
不支持此功能。 但是,可以通过简约的包装函数来实现。
在常见的地方定义以下功能,
function unhandledExceptionsHandler(asyncFunction) {
return async (req, res, next) => {
try {
await asyncFunction(req, res, next);
}
catch (e) {
// TODO Log error internally
res.status(500).send("Server Error");
}
}
}
包装您的回调函数,
app.get('/', unhandledExceptionsHandler(async (req, res) => {
await validate();
res.json({"foo": "bar"});
}));
答案 1 :(得分:0)
express
内置了错误处理机制。您可以通过添加拦截器来配置通用错误处理程序。
const express = require('express');
const app = express();
const port = 8080;
async function validate() {
let shouldFail = Math.random() >= 0.5;
if (shouldFail) {
throw new Error();
}
}
app.get('/', async (req, res) => {
await validate();
res.json({"foo": "bar"});
});
// This interceptor will be called with err object if any of the above code breaks
// This should always be a last interceptor
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
app.listen(port, () => console.log(`listening on port ${port}!`));
您可以详细了解express
错误处理here。