gpt4 book ai didi

node.js - 表达错误处理意见和最佳实践

转载 作者:太空宇宙 更新时间:2023-11-03 21:54:26 24 4
gpt4 key购买 nike

我有更多关于错误处理 NodeJs Express 应用程序的代码架构问题。我不确定错误处理的最佳模式是什么。关于这一点,什么情况应该被视为错误。例如,即使在发送错误凭据时预期会出现此响应,401 未经授权的代码是否仍被视为错误?

使用时:

//app.js file
app.use(err, req, res, next){}

我通常倾向于只在这里放置 5xx 错误,这代表找不到数据库或没有网络连接问题或功能故障的情况。至于其余的,我会通过显式编码 res.status(xxx).send(); 或类似的内容,从 Controller 手动发回状态代码,例如 401。但我所做的事情背后的问题是我倾向于重复自己,并且必须将日志记录分散在应用程序中。我的方法好吗?我是否应该为不同范围的状态代码创建多个错误处理中间件?我需要一个选项

最佳答案

我更喜欢使用middleware使用您的自定义错误类来处理此问题。

让我们看一个错误类,其中包含自定义错误消息、http 状态代码和日志级别(如果您使用记录器)。

module.exports = class ApiCalError extends Error {
constructor (message, status, logLevel) {

// Calling parent constructor of base Error class.
super(message);

// Capturing stack trace, excluding constructor call from it.
Error.captureStackTrace(this, this.constructor);

// Saving class name in the property of our custom error as a shortcut.
this.name = this.constructor.name;

// You can use any additional properties you want.
// I'm going to use preferred HTTP status for this error types.
// `500` is the default value if not specified.
this.status = status || 400;

this.logLevel = logLevel || 'warn';

}

toResponseJSON () {
return {
success: false,
message: this.message
}
}
};

现在,让我们看一下 Controller 。我们仅从此 Controller 发送了成功的响应,并将自定义错误传递给中间件。

  exports.Login = function(req, res, next) {
const validationResult = validateLoginForm(req.body)
if (!validationResult.success) {
var err = new customError(validationResult.message, 400, 'warn')
return next(err)
} else {
return passport.authenticate('local-login', (err, token, userData) => {
if (err) {
if (err.name == 'IncorrectCredentialsError' || err.name == 'EmailNotVerified') {
var error = new customError(err.message, 400, 'warn')
return next(error)
}
return next(err)
}
return res.json({
success: true,
message: 'You have successfully logged in!',
token,
user: userData
})
})(req, res, next)
}
}

现在,让我们看一下记录器和错误处理程序中间件。在这里,logger 将在 api 中记录错误并将错误传递给错误处理程序。然后,这些函数将在 app.use() 中使用。

    // Import library

var Logger = function(logger) {
return function(err, req, res, next) {
var meta = {
path: req.originalUrl,
method: req.method,
'user-agent': req.headers['user-agent'],
origin: req.headers.origin
}
if (err instanceof customError) {
logger.log(err.logLevel, err.message, meta)
return next(err)
} else {
logger.log('error', err.message, meta)
return next(err)
}
}
}
var ErrorHandler = function() {
return function(err, req, res, next) {
if (err instanceof customError) {
return res.status(err.status).json(err.toResponseJSON())
}else{
return res.status(500).json({
success: false,
message: err.message
})
}
}
}

module.exports = {
Logger,
ErrorHandler
}

关于node.js - 表达错误处理意见和最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44895276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com