Почему я не могу получить `name` - ключ продукта напрямую и мне нужно использовать цикл for_in? - PullRequest
0 голосов
/ 14 октября 2019

У меня в приложении toggleFavorites Redux action, и я сохраняю favorites id на Firebase database. Когда я fetch favorites с сервера, я пытаюсь получить name - ключ каждого id для запуска второй выборки и DELETE. Чего я не понимаю, так это почему мне нужно использовать цикл for_in, чтобы получить name - ключ favorite?

А именно, когда я POST a favorite, я могу получить к нему доступ без цикла for_in.

Вот outputs из logs (они также находятся вкод в комментариях):

console.log('POST: resData.name', resData.name); Output: POST: resData.name: -Lr8FPwl5V5PYRlnJ7uh

console.log('fetch: resData.name', resData.name); Output: fetch: resData.name: **undefined**

console.log('key:', key); Output: key: -Lr8FPwl5V5PYRlnJ7uh

После некоторых комментариев я узнал, что если я войду

console.log('JSON.stringify(resData))

где я получаю resData.name : undefined Я получаю:

Output: {"-Lr8N_5Zu75y46aHw5FV":{"id":"-LqzSctzym_uQ6CYd7Hw","isFav":true}}

То есть name свойство в fetch, DELETE, PATCH.

Но если я зарегистрирую тот же код в POST, то получу

{"name":"-Lr8Nv-EI5KeqTFnerYo"}

Так что только responseиз POST имеет свойство name.

Вот код (проверьте примечания):

export const toggleFavorite = (id, isFav) => {
    return async (dispatch) => {
        try { 
// If it is a favorite, post it.
            if (isFav) {
                const response = await fetch('https://app.firebaseio.com/favorites.json', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify({
                        id,
                        isFav
                    }) 

                });

                if (!response.ok) {
                    throw new Error(
                        'Something went wrong.'
                    );
                }
                const resData = await response.json();

                console.log('POST: resData.name', resData.name); // This is NOT undefined?
//Output: POST: resData.name -Lr8FPwl5V5PYRlnJ7uh

console.log('POST JSON.stringify(resData)', JSON.stringify(resData))
// Output: POST JSON.stringify(resData) {"name":"-Lr8Nv-EI5KeqTFnerYo"}

                dispatch({ type: TOGGLE_FAVORITE, productId: id });
            } else if (!isFav) {

                // First get the key in order to delete it in second fetch(...).
                const response = await fetch(`https://app.firebaseio.com/favorites/.json`);

                if (!response.ok) {
                    throw new Error(
                        'Something went wrong.'
                    );
                }

                const resData = await response.json();

                console.log('fetch: resData.name', resData.name); // Why is this undefined?
// Output: fetch: resData.name undefined

console.log('JSON.stringify(resData)', JSON.stringify(resData)) 
// Output: JSON.stringify(resData) {"-Lr8Nv-EI5KeqTFnerYo":{"id":"-LqzSctzym_uQ6CYd7Hw","isFav":true}

                for (const key in resData) {
                    console.log(key); // OK! Output: key: -Lr8FPwl5V5PYRlnJ7uh
                    await fetch(`https://ekthesi-7767c.firebaseio.com/favorites/${key}.json`, {
                        method: 'DELETE'
                    });

                    if (!response.ok) {
                        throw new Error(
                            'Something went wrong.'
                            );
                        }

                        dispatch({ type: TOGGLE_FAVORITE, productId: id });
                    }
                }
            } catch (err) {
                // send to custom analytics server
                throw err;
            }
        };
    };

На самом деле я пытался получить name также в PATCH но снова я получаю undefined. Хорошо работает только с POST. Кто-нибудь может объяснить, пожалуйста?

...