【问题标题】:Is there a way to use callback functions in joi validation?有没有办法在 joi 验证中使用回调函数?
【发布时间】:2021-08-04 06:24:26
【问题描述】:

他们的导师

我正在研究我在互联网上看到的代码,但如果我看到语法,他们使用了已被贬低的 Hapi/Joi。 我的问题是如何在 Joi 中使用这种语法?

app.post('/test', (req, res, next) => {

const id = Math.ceil(Math.random() * 9999999);

  Joi.validate(data, schema, (err, value) => {


    if (err) {
      res.status(400).json({
        status: 'error',
        message: 'Invalid request data',
        data: data
      });
    } else {
      res.status(200).json({
        status: 'success',
        message: 'User created successfully',
        data: Object.assign({id}, value)
      });
    }
  });
});

【问题讨论】:

    标签: javascript node.js joi


    【解决方案1】:

    通过检查Github中的类型(index.ds.ts)文件,确实没有回调样式validate函数,只有这两种方法:

            /**
             * Validates a value using the schema and options.
             */
            validate(value: any, options?: ValidationOptions): ValidationResult;
    
            /**
             * Validates a value using the schema and options.
             */
            validateAsync(value: any, options?: AsyncValidationOptions): Promise<any>;
    

    但是,如果您真的想要,可以使用util.callbackify - callbackify examplesvalidateAsync 转换为回调节点样式:

    const Joi = require('joi');
    const { callbackify } = require('util');
    
    // A very simple data object
    const obj = { a: 23 };
    
    // A very simple joi schema which checks if schema is an object with the `a` property being a string
    const schema = Joi.object({
      a: Joi.string(),
    });
    
    // Callback style (which i don't recommend since its not available in `joi` package)
    callbackify(() => schema.validateAsync(obj))((err, ret) => {
      if (err) {
        return res.status(400).json({
          status: 'error',
          message: 'Invalid request data',
          data: data,
        });
      }
      res.status(200).json({
        status: 'success',
        message: 'User created successfully',
        data: Object.assign({ id }, value),
      });
    });
    
    

    我会使用 Joi 提供的内容,如以下 2 个示例:

    // using async/await - you need to mark you controller as async, like:
    // app.post('/test', async (req, res, next) => ...
    
    try {
      await schema.validateAsync(obj);
      res.status(200).json({
        status: 'success',
        message: 'User created successfully',
        data: Object.assign({ id }, value),
      });
    } catch (err) {
      res.status(400).json({
        status: 'error',
        message: 'Invalid request data',
        data: data,
      });
    }
    

    甚至只是承诺:

    schema
      .validateAsync(obj)
      .then(() =>
        res.status(200).json({
          status: 'success',
          message: 'User created successfully',
          data: Object.assign({ id }, value),
        })
      )
      .catch(() =>
        res.status(400).json({
          status: 'error',
          message: 'Invalid request data',
          data: data,
        })
      );
    

    【讨论】:

    • 非常感谢@tam.teixeira 的解释,确实我也建议不要使用callbackify,因为它会污染代码。我最喜欢的选项将是第一个选项,但没有 try catch,因为它再次污染了代码。相反,我将使用自定义错误处理程序中间件,让 express 处理特定的错误。
    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多