Upsert массив объектов с помощью Supabase и Reactjs

Я новичок в сфере 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(), и это не работает должным образом.

Какую ошибку вы получаете при запуске этого?

Mansueli 04.11.2022 14:55

@ Мансуэли, я не получаю сообщения об ошибке. Это работает нормально. Проблема в том, что в массиве есть два объекта, и он помещает только первый объект в БД.

AS11 04.11.2022 16:09

Пробовали ли вы настроить их в Promise?

Mansueli 04.11.2022 20:12

@Mansueli Я использую асинхронное ожидание, но могу попробовать promise.all(). Я просто не понимаю, как это может помочь. Кажется, проблема с записью в БД. Не могли бы вы объяснить, каков ваш мыслительный процесс?

AS11 04.11.2022 20:37

@Mansueli Я попробовал пример promise.all(), который вы привели, и он не сработал. Он по-прежнему сохраняет только первый элемент в массиве

AS11 05.11.2022 02:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
245
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема, почему он выбирал первый элемент (я полагаю), заключается в том, что функция .foreach() не запускалась несколько раз. В любом случае это не был чистый способ вызова БД. В дополнение к этому я думаю, что данные, которые я отправлял в БД, не были в правильном формате как чистый массив объектов. Например, когда вы используете .map(), он возвращает два отдельных объекта. Супабаза (в моей конфигурации) не ожидала такого формата. Решение ниже.

  1. Я создал пустой массив
  2. Я использовал .map() для своего массива объектов
  3. Сохранил результат .map() в созданный мной массив.
  4. Отправил новый массив в БД одним вызовом.

      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() заключалось в том, что я слишком усложнил задачу.

Другие вопросы по теме