У меня в приложении 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
. Кто-нибудь может объяснить, пожалуйста?