不确定标题是否能准确解释问题所在,因此希望您可以更好地了解我所遇到的问题。

我有一条路由,其使用的代码与另一条路由几乎完全相同,而只有管理员才能进行更新。 因此,路由“ A”:route / update_fees有一组我想在路由“ B”下使用的Joi验证:route / update_agent_fees。 因此,我创建了一个验证文件夹,并从路由“ A”导出了验证,这是以下文件:

"use strict";

const Joi = require("joi");

module.exports = {
    payload: {
        fees: Joi.object().keys({
            default: Joi.array().items(
                Joi.object({
                    period: Joi.number().integer().required().description("Days to consider the fee"),
                    fee: Joi.number().integer().required().description("Fee's to be charged")
                })
            ).description("Array of fees to be charge in any shipment status").min(1),
            fees_status: Joi.object().keys({
                101: Joi.array().items(
                        Joi.object({
                            period: Joi.number().integer().required().description("Days to consider the fee"),
                            fee: Joi.number().integer().required().description("Fee's to be charged")
                        })
                    ).description("Array of fees for 101 shipment status").min(1),
                102: Joi.array().items(
                    Joi.object({
                        period: Joi.number().integer().required().description("Days to consider the fee"),
                        fee: Joi.number().integer().required().description("Fee's to be charged")
                    })
                ).description("Array of fees for 102 shipment status").min(1),
            }).description("Fees customizable for 101 and 102 status").min(1)
        }).xor("default", "fees_status")
    },
    headers: Joi.object({
        "csrf-decorator": Joi.string().required(),
        "accept-language": Joi.string().required(),
        "user-agent": Joi.string().required()
    }).options({
        allowUnknown: true
    })
}

在第二个文件中,我需要路由A,并添加和修改了路由B起作用所需的唯一更改:

"use strict";

const Joi = require("joi");
const set_agent_fee_rates_validation = require("./set_agent_fee_rates");

let admin_set_agent_fee_rates_validation = set_agent_fee_rates_validation;
admin_set_agent_fee_rates_validation.payload.agent_id = Joi.string().required();

module.exports = admin_set_agent_fee_rates_validation;

问题是,当我大摇大摆时,可以看到两个api端点都需要agent_id而只在路由B中才需要它。

在这里了解问题的任何帮助将不胜感激。 谢谢!

#1楼 票数:1 已采纳

为什么不导出功能而不是导出对象,然后为B对其进行修改? 该函数可以返回一个验证对象,一个用于A,然后一个用于B?

另一种选择是在修改之前深克隆验证对象。

这是使用函数而不是原始对象文字的方式

const Joi = require("joi");

const make_validator = (optional) => {
  const payload = {
    fees: Joi.object().keys({
      default: Joi.array().items(
        Joi.object({
          period: Joi.number().integer().required().description("Days to consider the fee"),
          fee: Joi.number().integer().required().description("Fee's to be charged")
        })
      ).description("Array of fees to be charge in any shipment status").min(1),
      fees_status: Joi.object().keys({
        101: Joi.array().items(
          Joi.object({
            period: Joi.number().integer().required().description("Days to consider the fee"),
            fee: Joi.number().integer().required().description("Fee's to be charged")
          })
        ).description("Array of fees for 101 shipment status").min(1),
        102: Joi.array().items(
          Joi.object({
            period: Joi.number().integer().required().description("Days to consider the fee"),
            fee: Joi.number().integer().required().description("Fee's to be charged")
          })
        ).description("Array of fees for 102 shipment status").min(1),
      }).description("Fees customizable for 101 and 102 status").min(1)
    }).xor("default", "fees_status")
  };

  if (optional && optional.payload) {
    const new_payload = Object.assign({}, payload, optional.payload);
  } else {
    const new_payload = payload;
  }

  return {
    new_payload,
    headers: Joi.object({
      "csrf-decorator": Joi.string().required(),
      "accept-language": Joi.string().required(),
      "user-agent": Joi.string().required()
    }).options({
      allowUnknown: true
    })}
  }

module.exports = make_validator

然后第二个片段变成

const Joi = require("joi");
const make_validator = require("./set_agent_fee_rates");

const set_agent_fee_rates_validation = make_validator();

const admin_set_agent_fee_rates_validation = make_validator({
  payload: {
    agent_id: Joi.string().required()
  }
});

module.exports = admin_set_agent_fee_rates_validation;

  ask by Atlante Avila translate from so

未解决问题?本站智能推荐:

1回复

描述性的Hapi / Joi验证错误

我一直在尝试在我们的节点应用程序中实现Joi(joi作为独立的,而不是hapi),它似乎正确地验证了模式,但错误始终是相同的 我从来没有得到关于它失败的密钥的具体信息以及它失败原因的描述。 这是我正在使用的示例模式: 这是我发送的json对象: 我在这做错了什么?
1回复

具有Joi验证AssertionError的HAPI 17

我正在将现有的Hapi 16应用移植到Hapi 17-并遇到Joi验证问题... 当我启动应用程序时(不是在访问路线时),出现以下错误: { AssertionError [ERR_ASSERTION]: Cannot set path parameters validations wi
1回复

通过 hapi/joi 验证对象时在现有错误中添加错误

所以,现在当我验证 'custDetail' 对象时,我想要以下 2 个错误: - CustomerName 错误,因为 'isInValidCustomer' 为 true - BankName 是必需的 我无法在现有错误对象中为 CustomerName 附加错误。 如果我使用“.error
2回复

如何处理hapi验证错误?

我有以下航路路线代码... 所以当我不传递firstName它会抛出这样的错误 现在,我需要处理catch中的上述错误
1回复

如何使用 joi 验证用户名是否唯一?

我在某处阅读了一篇文章,其中作者使用Joi通过检查数据库来异步验证用户名是否唯一。 我现在找不到它,我想知道我们如何用Joi做到这一点。
2回复

Joi验证 - 与POST的日期比较

我目前正在使用HapiJS / NodeJS中的Joi来验证数据。 一个POST特别具有两个ISO日期(开始日期和结束日期),这两个日期被传递到路线并经过验证以确保它们是ISO日期。 我知道我可以通过这两个日期并在控制器中进行一些验证,以确保开始日期在结束日期之前(即,开始日期不能是2
2回复

.when() 在 joi 验证中,根据另一个键验证一个键

管理员将创建用户,同时他将输入一些随机字符串作为密码。 当管理员编辑现有用户时,除非他想更改密码,否则不需要输入任何密码。 如果管理员没有输入任何密码,则将使用旧密码。 所以我试图使用.when()来处理这种情况。 当有效载荷中存在_id时(只有当用户存在时才可能) ,那么我们应该使密码字段可选,
1回复

Joi验证 - 如何验证只需要一个对象而另一个不需要的对象数组

我想使用Joi验证包含多个对象的数组。 虽然我找不到将数组列表中的一个对象标记为“required = false”的方法。 Joi有办法实现这个目标吗?