You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:00:06