Я вижу эту ошибку только во время навигации, Эта ошибка возникает только во время навигации и исчезает при обновлении браузера.
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]
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;
По сути, вы добавили атрибут output
в next.config.mjs
.
Это создает статическую сборку.
Однако статическая сборка предварительно отображает весь контент.
Таким образом, при разработке после посещения любого журнала он кэширует все журналы одновременно и отображает эти журналы.
Если после этого вы попытаетесь опубликовать какие-либо журналы, это не сработает, поскольку все журналы уже кэшированы, и новые журналы не будут кэшироваться.
Простым решением было бы удалить атрибут output
из next.config.mjs
, а также удалить функцию generateStaticParams
.