Open11

Next.jsでTIL投稿用のブログを作成する

Gekitenius.YGekitenius.Y

とっつきやすそうなので構成案Aで進めてみる。
バックエンドの構成はBの方がいいな。データストアは管理しやすいNotion、静的コンテンツしか無いからデプロイはGithub Pages使いたい(Vercelの無料枠残しておきたい)。

構成案A
フロントエンド:Next.js
データストア:Notion
デプロイ:Vercel
https://zenn.dev/kalubi/articles/de85ed8c741dc3

構成案B
フロントエンド:Next.js
データストア:Github(マークダウンファイル)
デプロイ:Github pages
https://zenn.dev/subt/articles/957bd5d01485e1
https://jamband.github.io/blog/2021/08/deploy-nextjs-app-to-github-pages/

Gekitenius.YGekitenius.Y

バックエンドにNotionを使うメリットとしてはモバイル端末からアクセスが良いのが一番の利点かな?
あとは適度に文字装飾や画像の添付とかができるのも嬉しい

Gekitenius.YGekitenius.Y

ローカルで動作するまで進められたのでGithub pagesでのデプロイに挑戦してみる

Gekitenius.YGekitenius.Y

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'
}
Gekitenius.YGekitenius.Y

Github Actionsでデプロイ通ったけど、それぞれの記事が404になってしまう
なぜ、、、、

Gekitenius.YGekitenius.Y

動的ルート生成部分の実装を直したらいけた

// 修正前
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 });
  });
}
Gekitenius.YGekitenius.Y
// 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
}