我目前正在使用swagger-express-middleware
软件包来针对我的Swagger API文档验证请求。
在their document之后,我已经实现了中间件并处理了如下所示的错误
createMiddleware(swaggerDoc, app, (middlewareError, middleware) => {
app.use(middleware.metadata());
app.use(middleware.parseRequest());
app.use(middleware.validateRequest());
// Error handler to send the swagger validation response
app.use((err, req, res, next) => {
res.status(err.status).json({
type: 'SCHEMA VALIDATION FAILED',
message: err.message
});
});
});
如果架构中有任何错误,我从中间件返回的响应具有属性message
,其中包含错误的描述,这显然是响应的重要组成部分,因为它告诉请求者遗漏了什么。但是,不幸的是,message
的内容不是很直观或可读性很强。例如,如果请求中缺少属性,则说明将为
"message": "The \"pinDetails\" body parameter is invalid ({\"Pindd\":\"asd\"}) \nJSON Schema validation error. \nData path: \"\" \nSchema path: \"/required/0\" \nMissing required property: pin"
如您所见,该消息不是很直观和干净,这使得它很难阅读。所以,我的问题是,该软件包是否提供了任何方式来获取较干净的消息版本,或者是否可以通过其他任何方式做到这一点?
注意:由于消息是多行的,而且最重要的是动态,所以我不能只拆分或替换字符串,否则看起来就像是一些无关的句子放在一起(也许更糟的是,我会这样做最终会做,但绝对不是我想要的。)
答案 0 :(得分:0)
我在swagger-express-middleware
中打开了一个问题,并根据答复(在下面引用),看来目前没有办法(除非使用dataPath
和schemaPath
)来输出更加人性化的消息。
链接到问题:https://github.com/APIDevTools/swagger-express-middleware/issues/120
开发者对此问题的答复:
是的,我同意错误消息不是非常用户友好或易于解析。错误ultimately come from tv4,这是我在后台使用的JSON模式验证器。 TV4在其Error对象中添加了一些有用的属性,例如dataPath和schemaPath,它们可以帮助您构造更加用户友好的消息。将来,我计划切换到Z-Schema,它具有更好的错误消息,并为Error对象添加了更多有用的属性,这使得很多更容易构造用户友好的消息。
因此,现在我只用\
替换了所有\n
和.
,以使其更具可读性。然后,我用"
替换了所有'
,以确保该字符串有效。像这样
res.status(err.status).json({
type: 'SCHEMA VALIDATION FAILED',
message: err.message.replace(/\r?\n|\r/g, '.').replace(/"/g, '\'')
});
显然这不是一个完全可靠的解决方案,但现在是一个改进。响应如下:
"message": "The 'pinDetails' body parameter is invalid ({'Pindd':'asd'}) .JSON Schema validation error. .Data path: '' .Schema path: '/required/0' .Missing required property: pin"