Как аннулировать массив слагов в Next.js?

Начиная с 12.1.0 возможна повторная проверка по требованию.

https://nextjs.org/docs/basic-features/data-fetching/incremental-static-regeneration

Отправка массива идентификаторов программ, как я могу аннулировать массив слагов? Я пробовал это:

export default async function handler(req, res) {
    // Check for secret to confirm this is a valid request
    if (req.query.secret !== process.env.NEXT_PUBLIC_SECRET_TOKEN) {
        return res.status(401).json({ message: 'Invalid token' })
    }

    try {
        const programIds: String[] = req.query.programId
        programIds.map((programId) =>
            await res.unstable_revalidate(`/hu/buyTicket/${programId}`)
        )
        
        return res.json({ revalidated: true })
    } catch (err) {
        // If there was an error, Next.js will continue
        // to show the last successfully generated page
        return res.status(500).send('Error revalidating')
    }
}

Я получил эту ошибку:

'await' expressions are only allowed within async functions and at the top levels of modules.

Я не знаю, исправит ли это это для вас, но, просто глядя на сообщение об ошибке, ваша проблема в том, что ваш .map() не является асинхронным. Изменение: programIds.map(async (programId) => ...)

Julius 09.04.2022 12:44

@Julius htanks, это была проблема :)

János 09.04.2022 12:55

Круто, я сделаю ответ, чтобы вы могли отметить вопрос как отвеченный

Julius 09.04.2022 12:56

Отвечает ли это на ваш вопрос? Async/Await внутри Array#map()

jonrsharpe 09.04.2022 15:10
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
1
4
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

.map не уважает await, даже если вы используете async. В вашей ситуации вы получите ответ до завершения повторной проверки, то есть неправильное поведение.

Правильный метод должен включать использование Promise.all, чтобы res.json вызывался только после завершения всех повторных проверок, а блок try/catch мог правильно отловить ошибку.

  await Promise.all(programIds.map(async (programId) =>
        await res.unstable_revalidate(`/hu/buyTicket/${programId}`)
  ))

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