【SECTION 9】错误处理

315 阅读1分钟

NDB

node debugger

设置 "debug": ndb server.js

Express应用中

image.png catch中不处理错误,而是将所有错误传递到一个中间件去处理。

全局错误处理中间件

image.png

image.png

创建AppError类

image.png

API路径错误

image.png

异步函数中的错误处理

结合Promise学习。 image.png

开发和生产环境

development

image.png

production

生产环境中,我们并不想暴露过多的错误信息给用户。

image.png

数据库出现的错误

CastError

无效id image.png

const handleCastErrorDB = err => {
  const message = `路径 ${err.path}: ${err.value}不正确`;
  return new AppError(message, 400);
};

11000

重复key image.png

const handleDuplicateFieldsDB = err => {
  const value = err.errmsg.match(/(["'])(\\?.)*?\1/)[0];
  console.log(value);

  const message = `键值: ${value} 重复,请使用别的值!`;
  return new AppError(message, 400);
};

ValidationError

验证错误 image.png

const handleValidationErrorDB = err => {
  const errors = Object.values(err.errors).map(el => el.message);

  const message = `输入数据不正确 ${errors.join('. ')}`;
  return new AppError(message, 400);
};
`

Unhandled Promise Rejection

未处理的异步错误。比如登录数据库密码错误,会导致程序直接退出,这不属于Express应用的错误。尽管我们可以直接在数据库连接的代码下写catch处理,但当程序体量变大,我们很难完全考虑到所有有可能被拒绝的promise,这也是我们要设置全局错误处理的原因。

image.png

Uncaught Exceptions

未处理的同步错误。

image.png

JsonWebTokenError、TokenExpiredError

const handleJWTError = () =>
  new AppError('令牌不正确,请重新登陆!', 401);

const handleJWTExpiredError = () =>
  new AppError('您的令牌已过期,请重新登陆!', 401);

全局错误处理路由

开发环境显示具体错误信息,生产环境中只需要告知用户错误的名称,如果是用户操作导致的错误,如网址输入不正确,登录会话过期,则提醒其改正或重新登录。 image.png