#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 я думаю, вам нужен массив, попробуйте это