npm 包 express-err 使用教程

介绍

express-err 是一个 Node.js Express 应用中全局异常处理的 npm 包。它可以方便地实现对 Express 应用程序中所有未捕获异常的集中处理并返回错误信息,同时可以自定义错误处理函数。

安装

在命令行中执行以下命令安装 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


纠错
反馈