less than 1 minute read

Проблема:

При передаче с бекенда на фронтенд Set - получаем пустой объект


Проблема в том, что когда вы отправляете sitemapsCollection и urlsCollection (которые являются объектами JavaScript типа Set) в ответе, они сериализуются в JSON. Однако, JavaScript’s JSON.stringify() (который используется при отправке ответа) не может корректно сериализовать объекты типа Set - он преобразует их в пустые объекты {}.

Проблема

Объекты Set преобразуются в пустые объекты при сериализации в JSON, потому что:

  1. Set не является нативным типом JSON
  2. Свойства объекта Set не являются перечисляемыми
  3. Только перечисляемые свойства сериализуются

Решение

Вам нужно преобразовать ваши объекты Set в массивы перед отправкой их в ответе:

    // ...existing code...
    
    console.log(`Length is ${sitemapsCollection?.size}`);
    console.log(`Length is ${urlsCollection?.size}`);
    console.log("sitemapsCollection", typeof sitemapsCollection);

    if (!sitemapsCollection?.size && !urlsCollection?.size)
      throw new Error("Can't parse sitemap");
    
    // Преобразуем Set в массивы для JSON сериализации
    const sitemapsArray = Array.from(sitemapsCollection);
    const urlsArray = Array.from(urlsCollection);

    return res.status(200).send({ 
      sitemapsCollection: sitemapsArray, 
      urlsCollection: urlsArray 
    });
    
    // ...existing code...

Альтернативный вариант, если хотите сохранить те же имена свойств:

return res.status(200).send({
  sitemapsCollection: [...sitemapsCollection],
  urlsCollection: [...urlsCollection]
});

Оба подхода дадут вам корректные массивы в вашем ответе, которые будут содержать все URL из ваших объектов Set.