介绍
express-err
是一个 Node.js Express 应用中全局异常处理的 npm 包。它可以方便地实现对 Express 应用程序中所有未捕获异常的集中处理并返回错误信息,同时可以自定义错误处理函数。
安装
在命令行中执行以下命令安装 express-err
:
npm install express-err
使用方法
在代码中引入 express-err
,并将其作为中间件使用。通常将 express-err
放在所有路由和其他中间件的后面,以确保能够捕捉到所有未处理的异常。
const express = require('express'); const app = express(); const expressErr = require('express-err'); // 自定义错误处理函数 function errorHandler(err, req, res, next) { console.error(err.stack); res.status(500).json({ message: 'Internal server error' }); } app.use(express.json()); // 注册 express-err 中间件 app.use(expressErr(errorHandler)); // 写一个简单的路由 app.get('/', function (req, res) { res.json({ message: 'Hello World!' }); }); // 开启服务器 app.listen(3000, function () { console.log('Example app listening on port 3000!'); });
当代码中发生异常时,express-err
会捕捉到它,调用自定义错误处理函数。
自定义错误处理函数
上述例子中,我们可以看到 express-err
使用了一个默认的错误处理函数,但是我们也可以使用自己的错误处理函数。下面是一个根据错误类型返回不同状态码的自定义错误处理函数。
function errorHandler(err, req, res, next) { console.error(err.stack); if (err instanceof SyntaxError) { res.status(400).json({ message: 'Bad request' }); } else if (err instanceof NotFoundError) { res.status(404).json({ message: 'Not found' }); } else { res.status(500).json({ message: 'Internal server error' }); } }
自定义错误处理函数需要接受四个参数:错误对象、请求对象、响应对象和下一个中间件的回调函数。
错误类型
express-err
支持以下几种错误类型:
- Error:通用的错误类型,表示未知错误。
- NotFoundError:请求的资源未找到。
- BadRequestError:请求数据不符合要求,例如缺少必要参数或参数格式不正确。
示例
const express = require('express'); const app = express(); const expressErr = require('express-err'); class NotFoundError extends Error {} class BadRequestError extends Error {} function errorHandler(err, req, res, next) { console.error(err.stack); if (err instanceof SyntaxError) { res.status(400).json({ message: 'Bad request' }); } else if (err instanceof NotFoundError) { res.status(404).json({ message: 'Not found' }); } else { res.status(500).json({ message: 'Internal server error' }); } } app.use(express.json()); app.use(expressErr(errorHandler)); // 根据请求参数返回相应的消息 app.get('/message', function (req, res, next) { try { if (!req.query.type) { throw new BadRequestError('Type parameter is missing'); } switch (req.query.type) { case 'hello': res.json({ message: 'Hello World!' }); break; case 'goodbye': res.json({ message: 'Goodbye World!' }); break; default: throw new BadRequestError('Invalid type parameter'); } } catch (err) { next(err); } }); // 开启服务器 app.listen(3000, function () { console.log('Example app listening on port 3000!'); });
在上述代码中,我们向 /message
路由发送 GET 请求,并且在路由中使用了 BadRequestError
类型的错误作为例子。
当请求的 type 参数缺失时,try...catch
中的抛错代码会将错误抛出,交由错误处理函数处理,处理函数会将其捕捉并返回状态码为 400 的错误信息。如果请求的 type 参数不正确,则错误处理函数同样会将其捕捉并返回状态码为 400 的错误信息。
如果请求成功,则会返回相应的消息。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/600673e2fb81d47349e53d99