swagger-express-middleware:清洁程序验证消息

时间:2018-10-11 21:53:13

标签: javascript validation express swagger middleware

我目前正在使用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"

如您所见,该消息不是很直观和干净,这使得它很难阅读。所以,我的问题是,该软件包是否提供了任何方式来获取较干净的消息版本,或者是否可以通过其他任何方式做到这一点?

  

注意:由于消息是多行的,而且最重要的是动态,所以我不能只拆分或替换字符串,否则看起来就像是一些无关的句子放在一起(也许更糟的是,我会这样做最终会做,但绝对不是我想要的。)

1 个答案:

答案 0 :(得分:0)

我在swagger-express-middleware中打开了一个问题,并根据答复(在下面引用),看来目前没有办法(除非使用dataPathschemaPath)来输出更加人性化的消息。

链接到问题: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"