gpt4 book ai didi

joi - 如何管理自行创建的错误消息,而不是使用默认的庆祝 @hapi/joi 代码

转载 作者:行者123 更新时间:2023-12-04 16:29:03 26 4
gpt4 key购买 nike

我有两个文件,一个是 api.js,另一个是 handler.js。对于模式处理,我正在使用庆祝模块 @hapi/joi

On api.js I wrote only the API name

On handler.js I wrote the API functionality.

api.js
//JOI Schema Validator Middleware.
router.use(celebrate({
body: Joi.object().keys({
post: Joi.string().max(10),
userid: Joi.string(),
})
}));

const handler = require('./handler');

router.post('/createpost', handler.createPost);

router.use(errors());

module.exports = router;

如果发生错误,我会得到这样的响应

{"statusCode":400,"error":"Bad Request","message":"child\"post\"失败,因为 [\"post\"长度必须小于或等于 10字符长]","validation":{"source":"body","keys":["post"]}}

我只想将此错误转换为我自己的格式错误,即类似这样的内容

{error: true, status: 500, message: 'validation error', version: x.x.2}

默认的joi错误是通过router.use(errors());这个模块产生的。我如何修改这个?非常感谢任何帮助或建议。

最佳答案

TL;DR:创建您自己的“errors()”函数。

您现在可能已经设法更改它,但就像我一样,我遇到了完全相同的问题并找到了这个无答案的线程。

好吧,对于 future 的读者来说,庆祝 errors() 只不过是一个函数,更准确地说,就是这个:

(err, req, res, next) => {
// If this isn't a Celebrate error, send it to the next error handler
if (!isCelebrate(err)) {
return next(err);
}

const {
joi,
meta,
} = err;

const result = {
statusCode: 400,
error: 'Bad Request',
message: joi.message,
validation: {
source: meta.source,
keys: [],
},
};

if (joi.details) {
for (let i = 0; i < joi.details.length; i += 1) {
const path = joi.details[i].path.join('.');
result.validation.keys.push(EscapeHtml(path));
}
}
return res.status(400).send(result);
}

在那里,您可以看到声明的响应对象“结果”以及它是如何完成的。因此,要更改它的输出,您必须不使用 errors() 并创建自己的 函数来处理它。

所以,我声明了一个新函数:

  private errorHandling = (err, req, res, next) => {
if (isCelebrate(err)) {
return res.send({
statusCode: 400,
message: err.joi.message
});
}

return next(err);
}

您显然可以更改以上内容以满足您的需求。


更新

Celebrate 将其错误结构更改为 CelebrateError,现在您需要使用以下命令访问错误详细信息:

  const errorBody = err.details.get('body'); // 'details' is a Map()
const { details: [errorDetails] } = errorBody;

而不是 err.joi。消息属性保持不变。


然后,我使用 app.use(this.errorHandling) 而不是使用 app.use(errors()),现在我得到格式为的庆祝响应我想要。

关于joi - 如何管理自行创建的错误消息,而不是使用默认的庆祝 @hapi/joi 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55954369/

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