NDB
node debugger
设置 "debug": ndb server.js
Express应用中
catch中不处理错误,而是将所有错误传递到一个中间件去处理。
全局错误处理中间件
创建AppError类
API路径错误
异步函数中的错误处理
结合Promise学习。
开发和生产环境
development
production
生产环境中,我们并不想暴露过多的错误信息给用户。
数据库出现的错误
CastError
无效id
const handleCastErrorDB = err => {
const message = `路径 ${err.path}: ${err.value}不正确`;
return new AppError(message, 400);
};
11000
重复key
const handleDuplicateFieldsDB = err => {
const value = err.errmsg.match(/(["'])(\\?.)*?\1/)[0];
console.log(value);
const message = `键值: ${value} 重复,请使用别的值!`;
return new AppError(message, 400);
};
ValidationError
验证错误
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,这也是我们要设置全局错误处理的原因。
Uncaught Exceptions
未处理的同步错误。
JsonWebTokenError、TokenExpiredError
const handleJWTError = () =>
new AppError('令牌不正确,请重新登陆!', 401);
const handleJWTExpiredError = () =>
new AppError('您的令牌已过期,请重新登陆!', 401);
全局错误处理路由
开发环境显示具体错误信息,生产环境中只需要告知用户错误的名称,如果是用户操作导致的错误,如网址输入不正确,登录会话过期,则提醒其改正或重新登录。