如何验证变量实际上是一个 joi 模式?

How to validate variable is actually a joi schema?

我正在尝试创建一个可重复使用的函数,您可以将其传入 joi 模式并针对 req.body 运行 进行验证。我想验证我的变量 schema 以确保它是一个有效的 joi 模式。

有办法吗?

function validatePayload(schema) {
  return (req, res, next) => {
    const valid = joi.validate(req.body, schema)
    if (valid.error) {
      return handleErr(res, HttpStatus.BAD_REQUEST, valid.error.details[0].message)
    }

    return next()
  }
}

似乎 Joi 通过检查是否在模式原型链中找到 Joi 构造函数来内部验证模式,因此,您可能可以使用相同的验证:

const mySchema = Joi.object().keys({
  username: Joi.string(),
  password: Joi.string()
});

const isValidSchema = mySchema instanceof Joi.constructor;

console.log(isValidSchema);
<script src="https://cdn.jsdelivr.net/npm/joi-browser@13.4.0/dist/joi-browser.min.js"></script>

现在有一个专门的方法来检查提供的对象是否是模式

const Joi = require('@hapi/joi')

const schema = Joi.any();
Joi.isSchema(schema); // true

const notSchema = {}
Joi.isSchema(notSchema); // false

https://hapi.dev/module/joi/api/?v=17.1.1#isschemaschema-options