Open11
Next.jsでTIL投稿用のブログを作成する
とっつきやすそうなので構成案Aで進めてみる。
バックエンドの構成はBの方がいいな。データストアは管理しやすいNotion、静的コンテンツしか無いからデプロイはGithub Pages使いたい(Vercelの無料枠残しておきたい)。
構成案A
フロントエンド:Next.js
データストア:Notion
デプロイ:Vercel
構成案B
フロントエンド:Next.js
データストア:Github(マークダウンファイル)
デプロイ:Github pages
バックエンドにNotionを使うメリットとしてはモバイル端末からアクセスが良いのが一番の利点かな?
あとは適度に文字装飾や画像の添付とかができるのも嬉しい
サンプルのGithubのページをおいておこう
あとこっちも参考資料としておいておこう
仕組み自体は簡単そうだからスクラッチで作っても良いかもね。
Notionとの連携やってみたけどエラーになる
DBの空の行(空の列?)を許容しない設計のため、空の行があるとエラーになる
ローカルで動作するまで進められたのでGithub pagesでのデプロイに挑戦してみる
Github Actionsでデプロイ時のエラーが出た。
Invalid request URLだと。
APIResponseError: Invalid request URL.
at buildRequestError (/home/runner/work/nextjs-notion-blog/nextjs-notion-blog/.next/server/chunks/101.js:6110:16)
at Client.request (/home/runner/work/nextjs-notion-blog/nextjs-notion-blog/.next/server/chunks/101.js:5618:54)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async /home/runner/work/nextjs-notion-blog/nextjs-notion-blog/.next/server/chunks/881.js:145:22
at async Object.generateStaticParams (/home/runner/work/nextjs-notion-blog/nextjs-notion-blog/.next/server/app/article/[slug]/page.js:616:22)
at async buildParams (/home/runner/work/nextjs-notion-blog/nextjs-notion-blog/node_modules/next/dist/build/utils.js:917:36)
at async /home/runner/work/nextjs-notion-blog/nextjs-notion-blog/node_modules/next/dist/build/utils.js:934:33
at async /home/runner/work/nextjs-notion-blog/nextjs-notion-blog/node_modules/next/dist/build/utils.js:1067:117
at async Span.traceAsyncFn (/home/runner/work/nextjs-notion-blog/nextjs-notion-blog/node_modules/next/dist/trace/trace.js:103:20) {
code: 'invalid_request_url',
status: 400,
headers: Headers {
[Symbol(map)]: [Object: null prototype] {
date: [Array],
'content-type': [Array],
'content-length': [Array],
connection: [Array],
'x-powered-by': [Array],
'x-notion-request-id': [Array],
etag: [Array],
vary: [Array],
'cf-cache-status': [Array],
'set-cookie': [Array],
server: [Array],
'cf-ray': [Array]
}
},
body: '{"object":"error","status":400,"code":"invalid_request_url","message":"Invalid request URL."}'
}
> Build error occurred
Error: Failed to collect page data for /article/[slug]
at /home/runner/work/nextjs-notion-blog/nextjs-notion-blog/node_modules/next/dist/build/utils.js:1156:15
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
type: 'Error'
}
Github Actionsでデプロイ通ったけど、それぞれの記事が404になってしまう
なぜ、、、、
動的ルート生成部分の実装を直したらいけた
// 修正前
export async function generateStaticParams() {
const database = await getDatabase();
return database?.map((page) => {
// page.properties.Slug?.formula?.string;について、SSGのとき(ビルドするとき)に
// なぜか生成されない。むしろ、なぜSSG以外では生成できているのかが謎
// formulaってなに? →時間あったら動作確認して中身見てみたい
const slug = page.properties.Slug?.formula?.string;
return ({ id: page.id, slug });
});
}
// 修正後
export async function generateStaticParams() {
const database = await getDatabase();
return database?.map((page) => {
// オブジェクトの構造参考に、properties.Slug.rich_textから情報を取得して
// slugの値(動的ルートの値)として利用する
const slug = page.properties?.Slug?.rich_text[0].text.content;
return ({ id: page.id, slug });
});
}
// DBの1レコード(ページ)のオブジェクト構造
{
object: 'page',
id: '12345678901234567890',
created_time: '2024-06-13T10:02:00.000Z',
last_edited_time: '2024-06-13T11:38:00.000Z',
created_by: { object: 'user', id: 'YYYYYYYYYYYYYYY' },
last_edited_by: { object: 'user', id: 'YYYYYYYYYYYYYYY' },
cover: null,
icon: null,
parent: {
type: 'database_id',
database_id: 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'
},
archived: false,
in_trash: false,
properties: {
CreatedDate: {
id: '%3AXM%40',
type: 'created_time',
created_time: '2024-06-13T10:02:00.000Z'
},
'タグ': { id: 'Ex%3BH', type: 'multi_select', multi_select: [] },
Slug: { id: 'a%3COL', type: 'rich_text', rich_text: [Array] },
Title: { id: 'dR%3BD', type: 'rich_text', rich_text: [Array] },
AutoCreatedTitle: { id: 'title', type: 'title', title: [Array] }
},
url: 'https://www.notion.so/2024-6-13-ZZZZZZZZZZZZZZZZZZ',
public_url: null
}