Show server-side validation errors after failed form submit

前端 未结 1 1306
挽巷
挽巷 2021-01-12 12:33

How can I show validation messages after failed form submit? API request returns HTTP 400 \'application/problem+json\' response and contains violations as a list with field

相关标签:
1条回答
  • 2021-01-12 13:21

    I have the solution for you, I'd recommend to do it with Saga and HttpError.

    First, from our dataProvider we need to throw the HttpError like this:

    ...
    import {HttpError} from 'react-admin';
    ...
    ...
    
    // Make the request with fetch/axios whatever you prefer and catch the error:
    // message - the message that will appear in the alert notification popup
    // status - the status code
    // errors - the errors in key => value format, example in comment below
    return fetchClient.request(config).then((response) => {
          return convertHTTPResponse(response, type, resource, params);
        }).catch(function (error) {
          throw new HttpError(error.response.data.message, error.response.status, error.response.data.errors);
        });
    

    Then create saga like that:

    import {CRUD_CREATE_FAILURE} from "react-admin";
    import {stopSubmit} from 'redux-form';
    import {put, takeEvery} from "redux-saga/effects";
    
    export default function* errorSagas() {
      yield takeEvery(CRUD_CREATE_FAILURE, crudCreateFailure);
    }
    
    export function* crudCreateFailure(action) {
      var json = action.payload;
      // json structure looks like this:
      // {
      //     username: "This username is already taken",
      //     age: "Your age must be above 18 years old"
      // }
      yield put(stopSubmit('record-form', json));
    }
    

    Please make sure the errors (json) is in the format like in the example above!

    Then insert the saga in the componenet:

    import errorSagas from './sagas/errorSagas';
    ...
    ...
    
    <Admin
            customSagas={[ errorSagas ]}
            loginPage={LoginPage}
            authProvider={authProvider}
            dataProvider={dataProvider}
          >
    

    Boom! it works

    Good luck!

    0 讨论(0)
提交回复
热议问题