hapijs joi 验证,只验证一个字段并允许任何字段

hapijs joi validation , just validate one field and to allow any field

我想验证一个字段并允许另一个字段不进行验证;通过示例只是为了验证:"firstname" 字段。在我的代码中,当我评论 'payload' 时,hapi 允许我记录任何字段,当我取消注释 'payload' 时,hapijs 不允许我记录任何字段,但我只想通过示例 'firstname' 来验证是 'string' 并让其余字段允许。我计划让变量字段符合数据库配置,所以我将只验证一些固定字段并保存另一个在前端控制的变量字段,而不是在后端

  config: {
      validate: {
         /* payload: {
            firstname: Joi.string(),
            lastname: Joi.string()
            ...anothers fields...

          }*/
      }
  }

更新: 感谢 Robert K. Bell,我修改了解决方案是添加 'validate':

  config: {
      validate: {
         options: {
            allowUnknown: true
          },
          payload: {
            firstname: Joi.string()
          }
      }
  }

您可能正在寻找 .unknown() method:

object.unknown([allow])

仅覆盖当前对象范围内未知键的处理(不适用于子对象),其中:

  • allow - 如果false,不允许未知键,否则忽略未知键。

js const schema = Joi.object({ a: Joi.any() }).unknown();

  config: {
      validate: {
        payload: Joi.object({
            'firstname': Joi.string(),
        }).options({ allowUnknown: true })
      }
  }

不是在验证中添加验证字段,而是直接使用 Joi 对象验证有效载荷。使用它接受 allowUnknown true 它将只验证 Joi 对象中提到的字段。

..... {allowUnknown: true}

根据文档,创建 Joi objectSchema 时可以使用“选项”方法。

即非常简单 UI 可以发送很多密钥,但只使用 2 个密钥电子邮件和密码。所以验证函数可以这样定义。

function validateUserForSubscription(input) {
    const schema = Joi.object({
        email: Joi.string().min(5).max(255).required().email(),
        password: Joi.string().min(5).max(1024).required()
    }).options({ allowUnknown: true });

    return schema.validate(input);
}

在其他文件中这样使用它。

const isValidUser = validateUserForSubscription(req.body);