Экспресс-API возвращает только первую пару ключ-значение объекта

#javascript #express

#javascript #экспресс

Вопрос:

Я извлекаю данные вложенного объекта. Я могу получить данные этого объекта на консоли, но когда я пытаюсь получить эти данные, например return res.json(imageObject) , я получаю только первую пару значений ключа этого объекта. Это ошибка на консоли. UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client . Данные консоли выглядят следующим образом { bigImage: 'https://url.com' }

 router.get("/", async(req, res) => {
  //...fetch data
  if (mediaData.type === "type1") {
    let allData = await mediaData.media;

    allData.map(async(Data) => {
      if (Data.imageType === "big") {
        let bigImage = await Data.url;
        let imageObject = {
          bigImage
        };
        console.log(imageObject);
        return res.json(imageObject);
      }
    });
  }
});  

Ответ №1:

Вы используете res inside a .map , который будет запускать его один раз для каждого элемента в массиве, который вы повторяете.

Вы не можете этого сделать. Вы можете использовать только res один раз для каждого req , потому что вы отвечаете браузеру. Если вы используете его более одного раза, вы получаете эту ошибку, что означает, что он уже использовался, и вы уже ответили.

Решение: используйте res один раз, а не внутри map .

Кроме того, .map здесь бесполезно, потому что вас не интересует результат, который он дает. Вы должны использовать forEach или, что еще лучше, for цикл (который можно прервать при определенных условиях).

Ответ №2:

Вы должны использовать for..of .

Это остановит выполнение вашей функции в операторе return

 router.get("/", async(req, res) => {
  //...fetch data
  if (mediaData.type === "type1") {
    let allData = await mediaData.media;

    let pendingResult = allData.filter(data => data.imageType === "big").map(async item => {
       let bigImage = await item.url;
       return { bigImage }
    });
    
    let result = await Promise.all(pendingResult);

    res.json(result);
  }
});
  

Комментарии:

1. Это не работает. по-прежнему возвращает только 1 пару ключ-значение

2. @rojass другой вопрос, как должен выглядеть ваш ожидаемый результат? не могли бы вы предоставить некоторые примеры

3. я ожидаю, что все URL-адреса изображений будут такими { {bigImage: ‘url’}, {bigImage: ‘url’} }

4. @rojass { {...}, { ... } } его недопустимый синтаксис

5. @rojass я думаю, вам нужен массив, попробуйте это