AWS SDK v3 DynamoDB二进制数据无法被Joi验证,如何调整Schema?
解决Joi无法识别Uint8Array为二进制类型的问题
问题本质是:Joi 默认的 joi.binary() 规则只识别 Node.js 原生的 Buffer 类型,而 AWS SDK v3 返回的二进制数据是 Uint8Array(通用环境的二进制数组类型),所以直接用默认规则会验证失败。
解决方案一:自定义验证规则(快速适配)
直接用 Joi 的 custom() 方法写一个验证逻辑,同时兼容 Buffer 和 Uint8Array:
const binarySchema = Joi.custom((value, helpers) => { // 检查是否为Buffer或Uint8Array类型 if (!(value instanceof Buffer || value instanceof Uint8Array)) { return helpers.error('any.invalid'); } return value; }).messages({ 'any.invalid': '字段必须为二进制类型(Buffer 或 Uint8Array)' });
解决方案二:扩展Joi的binary类型(全局复用)
如果项目多处需要验证这类二进制数据,可以扩展Joi的binary类型,让它原生支持Uint8Array:
// 扩展Joi const customJoi = Joi.extend((joi) => ({ type: 'binary', base: joi.binary(), validate(value, helpers) { // 先尝试默认的binary验证(针对Buffer) const defaultResult = joi.binary().validate(value); if (!defaultResult.error) { return defaultResult; } // 默认验证失败时,检查是否为Uint8Array if (value instanceof Uint8Array) { return { value }; } // 都不是则返回错误 return helpers.error('binary.invalid'); } })); // 后续使用时直接调用 customJoi.binary() const schema = customJoi.object({ binaryData: customJoi.binary().required() });
注意事项
你之前尝试的 Joi.binary().encoding('base64') 是用来验证字符串是否能被解析为base64编码的二进制数据,不适用于已经是二进制数组(Uint8Array/Buffer)的场景,所以不需要设置这个参数。
内容的提问来源于stack exchange,提问作者Jingyi Wang
相关产品推荐
相关产品推荐

