【问题标题】:One route, 2 different schemas validating payload in Hapi.js with Joi使用 Joi 验证 Hapi.js 中的有效负载的一条路线,两种不同的模式
【发布时间】:2019-08-30 19:19:51
【问题描述】:

我有 1 条路线,2 种不同的 joi 模式,我希望能够根据有效负载中的字段动态选择我使用的模式。

“一条路线,2 种模式(Hapi.js 与 Joi)”

因此,对于上下文,我有一条 hapi 路线,并且正在使用 joi 验证“someSchema” hapiRoute.js:

...
 "validate": {
        "payload": someSchema
 }
...

在 schema.js 中:

function ChooseSchema(schemaA, schemaB) {
  return Joi.when(Joi.ref("payload.data.attributes.someField"), {
    "is": Joi.string().valid("fieldIsValue"),
    "then": schemaA,
    "otherwise": schemaB
  });
}
module.exports = {
"someSchema": ChooseSchema(schemaA, schemaB)
}

schemaA 和 schemaB 的不同之处

因此,如果“someField”等于一个值:“fieldIsValue”,我将尝试使用“schemaA”,否则使用 schemaB。 目前它没有得到这个值“someField”,所以我相信只是返回 schemaB

【问题讨论】:

  • 为什么需要两个模式?
  • 由于需要对 2 个不同的用户进行不同的验证
  • 更新:我相信,一旦有效载荷验证在技术上已经开始(至少从 hapi.js 的角度来看),我就试图选择架构。这显然是不允许的

标签: javascript hapijs joi


【解决方案1】:

所以这里有一些有效的方法: 在 hapiRoute.js 中使用“request.query...”:

...
"onPostAuth": {
          "method": (request, hapi) => {
              request.query.someField= request.someInfo.somefield;
...

您可以像这样在 schema.js 中访问它:

function ChooseSchema(schemaA, schemaB) {
  return Joi.when(Joi.ref("$query.someField"), {
    "is": Joi.string().valid("fieldIsValue"),
    "then": schemaA,
    "otherwise": schemaB
  });
}

所以基本上我们设置了一个查询字符串参数,然后在 joi 模式中我们可以使用该值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2020-05-25
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多