我正试图在node js应用程序中的错误处理工作。任何人都可以帮助我如何建立集中的错误处理,而不使用尝试和捕获块在每个api。我对怎么做有点困惑。谁来帮帮我。
我已经尝试在中间件中创建错误函数。
我最近需要做错误处理。所以,我查阅了很多资料,最后想出了这个。我们将创建一个custom Error class
和ErrorHandler middleware
。自定义错误类用于动态发送其他细节,如statusCode和errMsg。并且,中间件用于一次集中处理所有错误,基本上控制完整的错误并发送错误响应。
-
创建自定义
Err
class Err extends Error { statusCode = 500; name = "InternalError"; err = "Error"; constructor(message, options = {}) { super(message); for (const [key, value] of Object.entries(options)) { this[key] = value; } } }
Err类接受以下内容,而内置的Error类只接受message
。
message
:无论你想显示给客户端options
:它可以包括与错误相关的附加信息,如err
(实际错误)name
(自定义/实际错误名称)statusCode
(如400,404等)
-
创建中间件
ErrorHandler
const errorHandler = (err, req, res, next) => { console.error(err); let errStatus = err.statusCode || 500; let errMsg = err.message; //handling some basic mongodb error if(err.name === 'CastError') { errMsg = `Resource not found. Invalid: ${err.path}`; errStatus = 400; } else if(err.name === 'ValidationError') { errMsg = `Invalid input entered: ${Object.values(err.errors).map(e => e.message)}`; errStatus = 400; } else if(err.code === 11000) { errMsg = `Duplicate ${Object.keys(err.keyValues)} entered`; errStatus = 403; } //you can handle many more such in-built or basic errors like related to jwt, etc return res.status(errStatus).json({ success: false, status: errStatus, message: errMsg, stack: process.env.ENV === 'DEV' ? err.stack : {} }) }
现在,错误处理非常简单。
-
当我们想抛出一个自定义错误时,我们可以这样做
const err = throw new Err("Leaderboard not exist for this quiz", { err: "RedisError", name: "EmptySetError", statusCode: 422 });
[注意:不需要发送所有的选项,如果你想,你可以只发送statusCode.]
-
或者如果我们从try中捕获错误…catch块
try { //do your work like await call } catch (err) { }
我们可以像
这样修改控制器const ctrl = (req, res, next) => {
//err is either custom or we are catching from try...catch
next(err);
}
我们将在index.js
文件中所有路由的最后添加此中间件。
app.routes....
app.use(ErrorHandler);
最后,一些更好的错误处理技巧:
- 好友
throw
,try
,catch
与async/await同步 - 记录错误到服务器,由中间件处理。
- 使用
Err
类抛出自定义错误 集中处理错误将使调试和阅读代码变得容易。 - 提供正确的错误代码。