Ошибка: на странице отсутствует параметр «generateStaticParams()», который необходим для конфигурации «вывод: экспорт»

Я вижу эту ошибку только во время навигации, Эта ошибка возникает только во время навигации и исчезает при обновлении браузера.

Error: Page "/(publish)/logs/publish/[id]/page" is missing param "/logs/publish/BrWyKK8oGhiSAnTrLDAX" in "generateStaticParams()", which is required with "output: export" config.

Это структура папок приложения с использованием app router с несколькими макетами.

root /
    ├──src
    │    ├── app /
    │    │    ├── (main)/
    │    │    │    ├── _models/
    │    │    │    │   ├── Log.ts
    │    │    │    ├── _services/
    │    │    │    │   ├── LogService.ts
    │    │    │    ├── _components/
    │    │    │    │   ├── Sidebar.tsx
    │    │    │    │   ├── Navbar.tsx
    │    │    │    │   ├── Pastelog.tsx
    │    │    │    │   │
    │    │    │    ├── logs /
    │    │    │    │   ├──[id]
    │    │    │    │   │   └── page.tsx
    │    │    │    │   └── layout.tsx
    │    │    │    │   └── page.tsx
    │    │    ├── (publish)/
    │    │    │    ├── logs /
    │    │    │    │   ├── publish /
    │    │    │    │   │    ├──[id]/
    │    │    │    │   │        └── page.tsx
    │    │    │    └── layout.tsx
    │    │    │
    │    │    └── layout.tsx
    │    │    └── global.css
    │    │    └── page.tsx

У меня есть боковая панель и MainContent (Pastelog/Preview).

оказывает

Пастелог: в baseurl/logs Предварительный просмотр: на baseurl/logs/[id]

  • Боковая панель — клиентский компонент, который отображает список журналов из локального хранилища (работает нормально).
  • В Pastelog есть кнопка для публикации журналов и перенаправления на baseurl/logs/publish/id.

Когда я нажимаю «Опубликовать», я сохраняю данные в Firestore и локальном хранилище и перенаправляюсь на динамический маршрут.

(метод публикации)

    async function publish() {
        setLoading(true);
        const log = new Log(
            expiryDate.toDate('UTC'),
            content,
            new Date(),
            LogType.TEXT,
            true,
            title,
            false,
        );
        const id = await logService.publishLog(log);
        if (!id) {
            setLoading(false);
            return;
        }
        router.push(`/logs/publish/${id}`);
        setLoading(false);
    }

Данные сохраняются как в локальном хранилище, так и в Firestore, но когда я перенаправляюсь на динамический маршрут, я вижу эту ошибку.

Error: Page "/(publish)/logs/publish/[id]/page" is missing param "/logs/publish/BrWyKK8oGhiSAnTrLDAX" in "generateStaticParams()
// logs/publish/[id]/page.tsx
import Preview from '@/app/(main)/_components/Preview';
import LogService from '@/app/(main)/_services/logService';

// This is required for dynamic routing in runtime
export const dynamicParams = true;

export async function generateStaticParams() {
    const logService = new LogService();
    const logs = await logService.fetchLogs();
    // logs.forEach(log => console.info(log.id));
    return logs.map(log => ({ id: log.id }));
}
export default function PublishPage({ params }: { params: { id: string } }) {
    const { id } = params;
    return <Preview
        logId = {id}
    />
};

Я ожидаю, что динамическая страница загрузится в logs/publish/id. Я проверил журналы, когда generateStaticParams вызывается.

const logs = await logService.fetchLogs();

содержит идентификатор недавно опубликованной страницы, означающий, что документ был сохранен в базе данных

если кому-то интересно, просмотрите исходный код

Попробуйте приложение здесь: http://pastelog.web.app/

следующий.config.mjs

/** @type {import('next').NextConfig} */
const nextConfig = {
    output: 'export',
    trailingSlash: true,
    images: {
        unoptimized: true
    }
};

export default nextConfig;

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
197
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

По сути, вы добавили атрибут output в next.config.mjs.

Это создает статическую сборку.

Однако статическая сборка предварительно отображает весь контент.

Таким образом, при разработке после посещения любого журнала он кэширует все журналы одновременно и отображает эти журналы.

Если после этого вы попытаетесь опубликовать какие-либо журналы, это не сработает, поскольку все журналы уже кэшированы, и новые журналы не будут кэшироваться.

Простым решением было бы удалить атрибут output из next.config.mjs, а также удалить функцию generateStaticParams.

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