React-admin: отсутствует объект заголовков в поставщике данных

#react-admin

#react-admin

Вопрос:

Я пытаюсь создать пользовательский поставщик данных для своего API. Я могу войти в систему и GET_LIST, но не могу обработать полученные данные. Я адаптировал требуемый формат вывода для ответов API, а также включил заголовок Content-Range.

С Postman возвращаются все заголовки, но, похоже, они отсутствуют в «ответе», который я получаю в методе convertHTTPResponse.

Поскольку заголовки являются пустыми, список не будет отображаться и показывать ошибку:

Предупреждение: отсутствует перевод для ключа: «Не удается прочитать свойство ‘hasOwnProperty’ неопределенного»

Конечно, что-то очевидное для опытных разработчиков, пожалуйста, помогите!

Редактировать: исправлено путем сохранения заголовков перед преобразованием res.json()

myDataProvider.js

 export default (apiUrl, httpClient = fetchUtils.fetchJson) => {
    let url = '';
    const token = localStorage.getItem('token');
    const options = {
        headers: new Headers({
            Accept: 'application/json',
            Authorization: 'Bearer '   token
        }),
    };
    switch (type) {
        case GET_LIST:
            {
                const {
                    page,
                    perPage
                } = params.pagination;
                const {
                    field,
                    order
                } = params.sort;
                const query = {
                    sort: JSON.stringify([field, order]),
                    range: JSON.stringify([
                        (page - 1) * perPage,
                        page * perPage - 1,
                    ]),
                    filter: JSON.stringify(params.filter),
                };
                url = `${apiUrl}/${resource}?${stringify(query)}`;
                break;
            }
        default:
            throw new Error(`Unsupported Data Provider request type ${type}`);
    }

    let headers;
    return fetch(url, options)
        .then(res => {
            headers = res.headers;
            return res.json();
        })
        .then(response => {
            //console.log(headers);
            switch (type) {
                case GET_LIST:
                    return {
                        data: response.data.map(resource => ({ ...resource, id: resource.uuid })),
                        total: parseInt(headers.get('content-range').split('/').pop(), 10)
                    };
                default:
                    return {
                        data: response
                    };
            }
        });
};
  

URL-адрес вызова API:

 http://localhost:9000/users?filter={}amp;range=[0,9]amp;sort=['uuid','DESC']
  

Результат с Postman:

 {
    "data": [
        {
            "uuid": "ff1xxa-ddsa-4232-b453-ed44e4dfc11d",
            "email": "fr2r32442231y@domain.net",
            "created_at": "2019-03-27T23:11:48.000Z",
            "updated_at": "2019-03-27T23:11:48.000Z",
        }
    "total": 74,
    "limit": 9,
    "offset": 0,
    "order": "DESC",
    "sort": "uuid",
    "success": true
}
  

Запрашивать заголовки с помощью Postman:

 Authorization:"Bearer token123"
cache-control:"no-cache"
Postman-Token:"5e0442c7-698d-46e2-8656-50f4b10de970"
User-Agent:"PostmanRuntime/7.6.1"
Accept:"*/*"
Host:"localhost:9000"
cookie:"connect.sid=s:mfwRL0cVcIcBhqqGy1w6epkxjEh0nRzr.cP03XewB3Na+6esVOvN/BE5gL8gQvO+bWCIkC5Vbq44"
accept-encoding:"gzip, deflate"
  

Заголовки ответа с Postman:

 Access-Control-Allow-Origin:"*"
Access-Control-Expose-Headers:"Content-Range,X-Content-Range"
X-DNS-Prefetch-Control:"off"
X-Frame-Options:"SAMEORIGIN"
Strict-Transport-Security:"max-age=15552000; includeSubDomains"
X-Download-Options:"noopen"
X-Content-Type-Options:"nosniff"
X-XSS-Protection:"1; mode=block"
Content-Range:"users 0-9/74"
Content-Type:"application/json; charset=utf-8"
Content-Length:"13063"
ETag:"W/"3307-8yJ9evfC/wq64GCJcSnFIwWEGC8""
Date:"Thu, 11 Apr 2019 14:03:13 GMT"
Connection:"keep-alive"