【问题标题】:Module.exports mixes two different Joi validations with Hapi.jsModule.exports 将两种不同的 Joi 验证与 Hapi.js 混合在一起
【发布时间】:2017-08-16 08:02:19
【问题描述】:

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

我有一条路线使用与另一条路线几乎完全相同的代码,该路线只有管理员可以访问以进行更新。所以路线“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 中需要它。

对于理解这里的问题的任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: node.js validation hapijs joi


    【解决方案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
    

    那么第二个sn-p就变成了

    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;
    

    【讨论】:

    • 我知道你要去哪里,正准备给你一个最佳答案。在阅读了 module.exports 如何被缓存之后,我现在已经在我的代码上做到了这一点。我觉得选择的答案应该有显示事情是如何实现的代码。但是如果没有其他人回答这个问题,我会回来并选择你作为最佳答案。感谢您的提示!
    • 好的,我在笔记本电脑前会添加。
    • 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多