Module.exports 将两种不同的 Joi 验证与 Hapi.js 混合
Module.exports mixes two different Joi validations with Hapi.js
不确定标题是否准确解释了问题所在,希望这能让您更好地了解我遇到的问题。
我有一条路线使用与另一条路线几乎完全相同的代码,只有管理员才能访问以进行更新。所以路线 "A": route/update_fees 有一组我想在路线 "B": route/update_agent_fees 下使用的 Joi 验证。所以我创建了一个验证文件夹并从路由 "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 中需要。
如果能帮助理解这里的问题,我们将不胜感激。谢谢!
与其导出一个对象,然后为 B 修改它,为什么不导出一个函数呢?该函数可以return一个验证对象,一个用于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;
不确定标题是否准确解释了问题所在,希望这能让您更好地了解我遇到的问题。
我有一条路线使用与另一条路线几乎完全相同的代码,只有管理员才能访问以进行更新。所以路线 "A": route/update_fees 有一组我想在路线 "B": route/update_agent_fees 下使用的 Joi 验证。所以我创建了一个验证文件夹并从路由 "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 中需要。
如果能帮助理解这里的问题,我们将不胜感激。谢谢!
与其导出一个对象,然后为 B 修改它,为什么不导出一个函数呢?该函数可以return一个验证对象,一个用于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;