Показать ошибку API в уведомлении - PullRequest
0 голосов
/ 24 августа 2018

Мне не хватает чего-то простого в документах. Когда я получаю ошибку проверки API, я возвращаю код состояния и сообщение. Похоже, что React-Admin переводит код состояния в общий код ошибки HTTP.

Мой ответ об ошибке.

{"error":
    {"statusCode":422,
    "name":"Error",
    "message":"User with same first and last name already on team."}
}

Когда мой ответ API с этим ответом, я вижу "Unprocessable Entity" в окне уведомления. Я использую SimpleForm.

Я знаю, что код состояния распознается, потому что я изменил 422, и он показывает соответствующее описание ошибки HTTP.

В документах написано, что в вашем провайдере данных выдается ошибка. Я переместил провайдера данных Simple Rest в свой проект и пытался выдавать ошибки в разных местах, но на клиенте ничего не меняется.

https://marmelab.com/react-admin/DataProviders.html#error-format

Если вы настроили ошибку в своем API, я был бы признателен за любые подсказки, которые вы можете дать. Thx.

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

в Backend, я структурирую ответ как

res.json({status:400,message:"Email Address is invalid!"})

На стороне клиента измените convertHTTPResponse в поставщике данных как:

const convertHTTPResponse = (response, type, resource, params) => {
    const { headers, json } = response;
    switch (type) {
        case GET_LIST:
        case GET_MANY_REFERENCE:
            if(json.status === 200){
                if (!headers.has('content-range')) {
                    throw new Error('The Content-Range header is missing in the HTTP Response.);
                }
                return {
                    data: json.docs,
                    total: parseInt(
                        headers
                            .get('content-range')
                            .split('/')
                            .pop(),
                        10
                    ),
                };
            }else{
                throw new Error(json.message)
            }

        default:
            if(json.status === 200){
                return { data: json.docs };
            }else{
                throw new Error(json.message)
            }
    }
0 голосов
/ 27 августа 2018

Вот фактическая обработка ошибок:

  1. Когда запускается выборка (обычно от поставщика данных), если происходит ошибка, она перехватывается и преобразуется в HttpError и-threw ( source )
  2. При этом сообщение об ошибке HTTP становится либо json.message, либо ответом statusText.Именно здесь ошибка HTTP 422 становится Unprocessable Entity ( source )
  3. Затем ошибка перехватывается снова на более высоком уровне для преобразования в действие с избыточностью.( source )
  4. Наконец, ошибка преобразуется в уведомление, содержащее сообщение об ошибке.

Итак, чтобы настроить сообщение об ошибке, вы можетеВы можете легко это сделать у своего провайдера, сначала обнаружив ошибку, настроив сообщение об ошибке и отправив его снова:

const dataProvider = (type, resource, params) => new Promise((resolve, reject) => {
    if (type === 'GET_LIST' && resource === 'posts') {
        return fetch(...args)
            .then(res => res.json())
            .then(json => {
                if (json.error) {
                    // The notification will show what's in { error: "message" }
                    reject(new Error(json.error.message));
                    return;
                }

                resolve(json);
            });
    }

    // ...
});
...