Переписывание Dataprovider для нескольких запросов API сломало его и теперь возвращает ошибку «Невозможно прочитать свойство hasOwnProperty из undefined» - PullRequest
2 голосов
/ 02 апреля 2019

Я использую пакетact-admin, и до меня дошло, что мне нужно переписать работающий поставщик данных, чтобы объединить два разных запроса API в один массив данных, прежде чем передавать данные в компонент ресурса, который будет отображать Это. После перезаписи я сохраняю в журнале возвращаемые данные, и они верны, но независимо от того, что я пробовал, я всегда получаю ошибку «Cannot read property» hasOwnProperty of undefined »перед моим console.log данных, и затем я получаю то же самое сообщение об ошибке несколько секунд спустя, и ничего не отображается.

в dataprovider.js (отображает данные в компоненте ресурса)

export default (type, resource, params) => {
    var apiUrl = `https://request1url.com/api`;
    let query = '';
    let url = '';
    const options = {
        headers : new Headers({
            Accept: 'application/json',
        }),
    };
    switch (type) {
        case GET_LIST: {
            if(resource === 'errors'){
                query = '/query/errors';
            }
            if(resource === 'people'){
                query = '/query/users';
            }
            url = `${apiUrl}${query}`;
            break;
        }
        default:
            throw new Error(`Unsupported Data Provider request type ${type}`);
    }

    return fetch(url, options)
        .then(res => {
            return res.json()
        })
        .then(json => {
            var data = [];
            var result = json.data.result;
                for(var i = 0; i < result.length; i++){
                    result[i].id = i
                    data.push(result[i])
                }
            }
            console.log(data)
            switch (type) {
                case GET_LIST:
                return {
                    data: data,
                    total: data.length
                }
                case GET_ONE:
                return {
                    data: data,
                }
                default:
                    return { data: data};
            }
        });
};

в NEWdataprovider.js (переписать)

export default (type, resource, params) => {
    const apiRequests = ['https://request1url.com/api','https://request2url.com/api'];
    let query = '';
    const options = {
        headers : new Headers({
            Accept: 'application/json',
        }),
    };
    switch (type) {
        case GET_LIST: {
            if(resource === 'errors'){
                query = '/query/errors';
            }
            if(resource === 'people'){
                query = '/query/users';
            }
            break;
        }
        default:
            throw new Error(`Unsupported Data Provider request type ${type}`);
    }
    var req1 = fetch(`${apiRequests[0]}${query}`, options).then(function(response){ 
        return response.json()
    });
    var req2 = fetch(`${apiRequests[1]}${query}`, options).then(function(response){
        return response.json()
    });
    Promise.all([req1,req2]).then(function(values){
        var data = [];
        var result1 = values[0].data.result;
        var result2 = values[1].data.result;
        for(var i = 0; i < result1.length; i++){
            result1[i].id = i
            data.push(result1[i])
        }
        for(var j = 0; j < result2.length; j++){
            result2[j].id = j
            data.push(result2[j])
        }
        console.log(data)
            switch (type) {
                case GET_LIST:
                return {
                    data: data,
                    total: data.length
                }
                default:
                    return { data: data};
            }
        });
};

в App.js

<Admin dataProvider={dataProvider}>
  <Resource name="errors" list={errors} />
  <Resource name="people" list={people} />
</Admin>
);

в console.log регистрируемые данные имеют правильный формат, и данные должны отображаться, но с оригинальным поставщиком данных он отображает список элементов, а новый поставщик данных возвращает сообщение об ошибке «Не удается прочитать свойство hasOwnProperty» неопределенный "

1 Ответ

2 голосов
/ 02 апреля 2019

Ваш поставщик данных должен вернуть обещание.Согласно документам ...

/**
 * Query a data provider and return a promise for a response
 *
 * @example
 * dataProvider(GET_ONE, 'posts', { id: 123 })
 *  => Promise.resolve({ data: { id: 123, title: "hello, world" } })
 *
 * @param {string} type Request type, e.g GET_LIST
 * @param {string} resource Resource name, e.g. "posts"
 * @param {Object} payload Request parameters. Depends on the action type
 * @returns {Promise} the Promise for a response
 */
const dataProvider = (type, resource, params) => new Promise();

Попробуйте вместо return Promise.all().

export default (type, resource, params) => {
    const apiRequests = ['https://request1url.com/api','https://request2url.com/api'];
    let query = '';
    const options = {
        headers : new Headers({
            Accept: 'application/json',
        }),
    };
    switch (type) {
        case GET_LIST: {
            if(resource === 'errors'){
                query = '/query/errors';
            }
            if(resource === 'people'){
                query = '/query/users';
            }
            break;
        }
        default:
            throw new Error(`Unsupported Data Provider request type ${type}`);
    }
    var req1 = fetch(`${apiRequests[0]}${query}`, options).then(function(response){ 
        return response.json()
    });
    var req2 = fetch(`${apiRequests[1]}${query}`, options).then(function(response){
        return response.json()
    });
    return Promise.all([req1,req2]).then(function(values){
        var data = [];
        var result1 = values[0].data.result;
        var result2 = values[1].data.result;
        for(var i = 0; i < result1.length; i++){
            result1[i].id = i
            data.push(result1[i])
        }
        for(var j = 0; j < result2.length; j++){
            result2[j].id = j
            data.push(result2[j])
        }
        console.log(data)
            switch (type) {
                case GET_LIST:
                return {
                    data: data,
                    total: data.length
                }
                default:
                    return { data: data};
            }
        });
};
...