胖蔡说技术
随便扯扯

express添加错误处理中间件

使用Express开发Nodejs服务时,为了统一配置API请求返回错误,我们可以在Express中添加错误处理的中间件,用于统一处理接口请求中出现的各种错误信息,以便我们快速定位错误原因。本文简单介绍如何创建一个Express错误中间件。

定义错误类

首先需要我们根据业务定义几个常规的错误处理类,用于区别错误信息种类,错误类的定义是在项目顶层创建一个error目录,所有的错误信息都放在该目录下,我这里主要分为如下几种类型错误:

  • NotFondError:404
  • NoAuthError:401
  • InternalError: 500
  • BaseError:自定义

1、创建Enum.js文件

module.exports = {

  StatusCode:{
    OK: 200, 
    NotFond:404,
    InternalError:500,
    NoAuth:401,
  },
  ErroMessage:{
    NotFond:'当前请求不存在!',
    InternalError:'内部服务错误',
    NoAuth:'身份为验证',
  }
}

2、创建BaseError.js

const Enum = require("./Enum");
class BaseError extends BaseError {
  constructor(code,message){
    if (!message) {
      message = '未知错误';
    }
    if(!code) {
      this.code = Enum.StatusCode.InternalError;
    }
    super(message);
  }
}

3、创建NotFondError.js

const Enum = require("./Enum");
const BaseError = require("./BaseError ");

class NotFondError extends BaseError {
  constructor(message){
     if (!message) {
       message = Enum.ErroMessage.NotFond;
     }
    super(Enum.StatusCode.NotFond,message);
  }
}

4、创建NoAuthError.js

const Enum = require("./Enum");
const BaseError = require("./BaseError ");

class NoAuthError extends BaseError{
  constructor(message){
    if (!message) {
      message = Enum.ErroMessage.NoAuth;
  }
  super(Enum.StatusCode.NoAuth,message);
  }
}

5、创建InternalError.js

const Enum = require("./Enum");
const BaseError = require("./BaseError ");

class InternalError extends BaseError  {
  constructor(message){
    if (!message) {
      message = Enum.ErroMessage.InternalError;
  }
  super(Enum.StatusCode.InternalError,message);
  }
}

6、创建index.js

const BaseError = require("./BaseError ");
const NotFoundError = require("./NotFoundError");
const NoAuthError= require("./NoAuthError");
const InternalError= require("./InternalError");
module.exports = {
  BaseError ,
  NotFoundError ,
  NoAuthError,
  InternalError,
};

创建中间件

中间件我们通常可以放在同一个文件夹,首先创建一个存放中间件处理的文件夹middleware,然后就可以创建我们的错误处理中间件了,代码如下:

// middleware/exception.js
const {
  BaseError
} = require("../error");

const exception= async (err, req, res, next) => {
  const exception = new BaseError();
  if (err instanceof BaseError) {
    return res.status(err.code).json({
      msg: err.message,
      code:err.code,
    });
  }
  return res.status(customerError.statusCode).json({
    msg: customerError.message,
    code:err.code,
    err
  });
}
module.exports = exception;

添加完中间件后,我们还需要将其添加到express中,代码如下:

var app = express();
const {
  exception
} = require('./middleware');
const {
  NotFondError
} = require("../error");

var apisRouter = require('./routes/apis');
app.use('/api', apisRouter);
app.use('/api',function(req, res, next) {
  throw new NotFondError();
});
app.use('/api',exception);

使用自定义错误处理

如上已经给出了一个404错误的示范,直接通过throw抛出异常即可,当我们在一个接口中需要返回自定义异常可以如下所示:

var express = require('express');
var router = express.Router();
const {
  BaseError
} = require("../error");

router.get('/test',function(req,res,next) {
   const query =  req.query;
   if(!query || Object.keys(query).length === 0){
      throw new BaseError(403,'该接口query不能为空!');
   }

   res.status(200).json({
    code:200,
    message:'请求成功!',
   })

})


module.exports = router;
赞(0) 打赏
转载请附上原文出处链接:胖蔡叨叨叨 » express添加错误处理中间件
分享到: 更多 (0)

请小编喝杯咖啡~

支付宝扫一扫打赏

微信扫一扫打赏