Я новичок в сфере SQL и пытаюсь использовать Supabase для веб-приложения, которое я создаю. Я пытаюсь передать объекты массива в БД, но я обнаружил, что он захватывает только первый элемент в массиве и добавляет его в БД. Функциональность конечной цели заключается в том, что он захватывает весь массив объектов и подталкивает его, и если он обнаруживает изменение (почему я использую upsert), то добавляет этот объект в массив.
ownedNFTs — это массив объектов.
const nakedDB = () => {
try {
setLoading(true);
ownedNFTs.forEach(async (nft) => {
let { data, error, status } = await supabase.from("Users").upsert({
wallet_address: wallet?.accounts[0].address,
NFTS: {
name: nft?.metadata?.name || "",
description: nft?.metadata?.description || "",
image: nft?.metadata?.image || "",
externalUrl: nft?.metadata?.external_url || "",
contractAddress: nft?.contract.address || "",
tokenId: nft?.id.tokenId || "",
blockchain: "Ethereum",
metaverse: nft?.metadata?.name.split(" ")[0] || "",
metadata: nft?.metadata || "",
symbol: nft?.contract.symbol || "",
},
}).eq('wallet_address', wallet?.accounts[0].address);
console.info(data)
if (error && status !== 406) {
throw error;
}
});
} catch (error) {
console.table(error);
} finally {
setLoading(false);
}
};
Я попытался следовать документации Supabase по массовой загрузке, но это означает одновременное создание нескольких строк. Я также пытался создать стандартную петлю for, но это тоже не сработало. Моя текущая реализация использует forEach(), и это не работает должным образом.
@ Мансуэли, я не получаю сообщения об ошибке. Это работает нормально. Проблема в том, что в массиве есть два объекта, и он помещает только первый объект в БД.
Пробовали ли вы настроить их в Promise?
@Mansueli Я использую асинхронное ожидание, но могу попробовать promise.all(). Я просто не понимаю, как это может помочь. Кажется, проблема с записью в БД. Не могли бы вы объяснить, каков ваш мыслительный процесс?
@Mansueli Я попробовал пример promise.all(), который вы привели, и он не сработал. Он по-прежнему сохраняет только первый элемент в массиве



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема, почему он выбирал первый элемент (я полагаю), заключается в том, что функция .foreach() не запускалась несколько раз. В любом случае это не был чистый способ вызова БД. В дополнение к этому я думаю, что данные, которые я отправлял в БД, не были в правильном формате как чистый массив объектов. Например, когда вы используете .map(), он возвращает два отдельных объекта. Супабаза (в моей конфигурации) не ожидала такого формата.
Решение ниже.
.map() для своего массива объектов.map() в созданный мной массив. const nakedDB = async () => {
try {
ownedNFTs.map((nft) => {
// console.info(nft)
nftArray.push(nft);
});
setLoading(true);
let { data, error, status } = await supabase
.from("Users")
.upsert({
wallet_address: wallet?.accounts[0].address,
NFTS: nftArray,
})
.eq("wallet_address", wallet?.accounts[0].address);
if (error && status !== 406) {
throw error;
}
} catch (error) {
console.table(error);
} finally {
setLoading(false);
}
};** Обновленное решение **
ownedNFTs уже является массивом объектов в правильном формате. Я удалил .map() и напрямую сохранил ownedNFTs в БД, и он сохраняет все элементы. Решение .map() заключалось в том, что я слишком усложнил задачу.
Какую ошибку вы получаете при запуске этого?