【问题标题】:swagger-express-middleware : Cleaner validation messageswagger-express-middleware : 更干净的验证消息
【发布时间】:2018-10-11 21:53:13
【问题描述】:

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

如您所见,该消息不是很直观和干净,因此难以阅读。所以,我的问题是,这个包是否提供了任何方法来取回更清晰的消息版本,或者我可以做同样的任何其他方式?

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

【问题讨论】:

    标签: javascript validation express swagger middleware


    【解决方案1】:

    我在swagger-express-middleware 中打开了一个问题,根据回复(引用如下),目前似乎没有办法(除了可能使用dataPathschemaPath)输出更用户友好的消息.

    问题链接:https://github.com/APIDevTools/swagger-express-middleware/issues/120

    开发者对此问题的回应:

    是的,我同意错误消息不是非常用户友好或易于解析。错误ultimately come from tv4,这是我在后台使用的 JSON Schema 验证器。 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"
    

    【讨论】:

    • 不确定这是否与您相关,但在我使用 express 构建的 REST API 中,我使用了来自 hapi 的精彩 Joi 包进行模式定义和请求验证。我使用npmjs.com/package/express-validation 轻松地从快速路由处理程序调用 Joi 模式验证。然后我使用npmjs.com/package/joi-to-swagger 将我的 joi 模式转换为招摇。有了这个,我就可以为我的 API 提供完整的 Swagger UI 文档,而且还带有 Joi 的漂亮验证和错误消息。
    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2013-11-23
    • 2017-10-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多