【问题标题】:How to handle hapi validation errors?如何处理 hapi 验证错误?
【发布时间】:2018-06-29 18:33:42
【问题描述】:

我有以下 hapi 的路线代码...


const routeConfig = {
  method: 'POST',
  path: '/user',
  config: {
    validate: {
      payload: {
        firstName: Joi.string().required(),
      }
    },
    handler
  }
}

所以当我没有通过firstName 时,它会抛出这样的错误

{
    "statusCode": 400,
    "error": "Bad Request",
    "message": "child \"firstName\" fails because [\"firstName\" is required]",
    "validation": {
        "source": "payload",
        "keys": [
            "firstName"
        ]
    }
}

现在,我需要在 catch 中处理上述错误

const handler = async(request, reply) => {
  try {
    const payload = request.payload
    const createUser = await User.create(payload)
    let token = Helpers.createJwt(createUser) 
    reply({ success: true, message: 'User created successFully', token })
  } catch(err) {
     // need to do something here to handle the error like
     if (err) {
       reply ({ error: "firstName is required", message: "Signup unsuccessfull" })
     }
  }
}

【问题讨论】:

    标签: node.js validation hapijs joi


    【解决方案1】:

    有一个更好的解决方案:

    config: {
            validate: {
                payload: {
                    firstName: Joi.string().required(),
                },
                failAction(request, reply, source, error) {
                  reply({
                    error: 'badRequest',
                  }).code(400);
                },
            },
        },
    

    如果 Joi 验证失败,它将触发 failAction,您将能够处理错误(将其发送到日志服务和/或返回特定消息)。

    它在文档中有点隐藏,但这里是the relevant part

    我必须承认,我没有用 hapi 17 尝试过...

    【讨论】:

    • 很高兴我能帮上忙
    • 你的权利......而且文档在这一点上并不是很清楚
    • 嗨 ernest...我有一个问题...当我启动我的 hapi 服务器然后没有显示任何日志...您对此有任何想法吗?如果你知道答案,那么我会提出一个问题
    • 是的,我有答案。在hapijs.com/tutorials 处查看“创建服务器”部分。 17以下的hapi版本,你应该在server.start回调中放一个console.log
    • 你的意思是options: { prettyPrint: false, logEvents: ['response'] }??
    【解决方案2】:

    也许你应该试试这样的东西?

    const routeConfig = {
      method: 'POST',
      path: '/user',
      config: {
        validate: {
          payload: {
            firstName: Joi.string().required().error(new Error('firstName is required')),
          }
        },
        handler
      }
    }
    

    看看这个页面here

    希望对你有帮助。

    【讨论】:

    • 谢谢Sparw...有没有更好的方法呢?
    • 我不确定有没有更好的方法来正确地做到这一点.. :/
    • 您的回答可以帮助我更改消息,而 Ernest 的回答可以帮助我回复该消息...所以谢谢它有效...
    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 2018-07-25
    • 2017-12-05
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多