axios で Laravel のバリデーションエラーを取得する方法

catch で取得した response.status が 422 ならバリデーションエラーになる。
その場合、response.data.errors にバリデーションエラーの文言が入っているので、ループで取り出して表示すればよい。

<input type="text" name="hoge" value="{{ old('hoge', $fuga['hoge']) }}">

<!--
  #test_send_error にバリデーションエラーを表示
  d-none で最初は非表示にする
-->
<span id="test_send_error" class="text-danger small d-none"></span>

<button type="button" onclick="testSend()">テスト送信</button>

<script>
async function testSend() {
  if (!confirm("テスト送信しますか?")) {
    return
  }

  // 既にエラーが表示済みの場合は非表示にする
  $('#test_send_error').addClass('d-none')

  let formData = new FormData()
  formData.append('hoge', $('input[name=hoge]').val())

  // 10秒でタイムアウト
  await axios.post('/api/test', formData, {timeout: 10000})
  .then(res => {
    // 成功した場合の処理
  })
  .catch(e => {
    // 10秒を超えてタイムアウトした際の処理
    if (e.response == null) {
      alert('接続がタイムアウトしました。\n入力が正しいかご確認ください。')
      return
    }

    // バリデーションエラーの処理
    if (e.response.status == 422) {
      let errors = e.response.data.errors
      let mes = ''
      $.each(errors, function(key, val) {
        mes += '<i class="fas fa-exclamation-circle mr-2"></i>' + val + '<br>'
      })
      $('#test_send_error').html(mes)
      $('#test_send_error').removeClass('d-none')

    // それ以外のエラー処理
    } else {
      let mes = e.response.status + ' エラー\n'
      mes += statusText
      alert(mes)
    }
  })
}
</script>