DATA-WORLD-BLOG

post=null ? _LinkPage & MentionPage

👀horomi

image block

Original code

---
import { Post } from '../../lib/interfaces.ts'
import { getPostByPageId } from '../../lib/notion/client'
import { getPostLink } from '../../lib/blog-helpers.ts'
import '../../styles/notion-color.css'
import arrow from '../../images/icon-arrow-link.svg'
export interface Props {
  pageId: string
}
const { pageId } = Astro.props
let post: Post = null
if (pageId) {
  post = await getPostByPageId(pageId)
}
---

{
  post ? (
    <a href={getPostLink(post.Slug)} class="link">
      <>
        <span class="icon">
          {post.Icon && post.Icon.Type === 'emoji' ? (
            post.Icon.Emoji
          ) : post.Icon && post.Icon.Type === 'external' ? (
            <img src={post.Icon.Url} class="notion-icon" />
          ) : (
            '📄'
          )}
          <img src={arrow} class="icon-link" alt="" />
        </span>
        <span class="text">{post.Title}</span>
      </>
    </a>
  ) : (
    <a class="link">
      <span class="icon">
        🚫
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text not-found">Post not found</span>
    </a>
  )
}
src/components/notion-blocks/Mention.astro

Fixing with ChatGPT

❓ Promptifの蚘述の仕方

astro.jsでブログを開発しおいたす。

蚘事を管理するDBを぀甚意しおいたす。
぀のバヌゞョンはできおいるずころにこれから぀目も察応しようずしおいたす。

ifの蚘述の仕方を教えおください

const { pageId } = Astro.props

let post: Post = null
let subPost: SubPost = null
if (pageId) {
  post = await getPostByPageId(pageId)
}
💬 Answer

次のバヌゞョンで2぀目の蚘事を管理するために、条件分岐を远加する必芁がありたす。以䞋は、if 文を䜿甚しお2぀目の蚘事subPostを取埗する方法の䞀䟋です。

const { pageId } = Astro.props

let post: Post = null
let subPost: SubPost = null

if (pageId) {
  if (/* 2぀目の蚘事の条件 */) {
    subPost = await getSubPostByPageId(pageId)
  } else {
    post = await getPostByPageId(pageId)
  }
}

䞊蚘のコヌドでは、最初に pageId が存圚するかどうかをチェックしおいたす。その埌、2぀目の蚘事を取埗するための条件を远加したした。条件匏の郚分は、実際の芁件に合わせお蚘述する必芁がありたす。もし2぀目の蚘事の条件が /* 2぀目の蚘事の条件 */ の郚分に耇雑な条件匏ずしお蚘述される堎合は、具䜓的な芁件を教えおいただければ、より具䜓的なコヌドを提䟛するこずができたす。

この䟋では、subPost ず post の初期倀を null に蚭定しおいたす。条件分岐の結果、2぀目の蚘事が取埗できれば subPost に代入され、そうでなければ post に代入されたす。

❓ Prompt提瀺する範囲を増やす

> ぀目の蚘事の条件
ずいう郚分が分からないので、もう少し前の郚分からお䌝えしたす。


import { Post,SubPost } from '../../lib/interfaces.ts'
import { getPostByPageId,getSubPostByPageId } from '../../lib/notion/client'
import { getPostLink,getSubPostLink } from '../../lib/blog-helpers.ts'
import '../../styles/notion-color.css'
import arrow from '../../images/icon-arrow-link.svg'

export interface Props {
  pageId: string
}

const { pageId } = Astro.props

let post: Post = null
let subPost: SubPost = null
if (pageId) {
  post = await getPostByPageId(pageId)
}
💬 Answer

おっしゃる内容から、getPostByPageId関数ずgetSubPostByPageId関数を䜿甚しお、それぞれ異なる条件で蚘事を取埗する必芁があるようですね。

以䞋は、前提ずしおいるモゞュヌルのむンポヌト郚分を含むコヌドです。

import { Post, SubPost } from '../../lib/interfaces.ts'
import { getPostByPageId, getSubPostByPageId } from '../../lib/notion/client'
import { getPostLink, getSubPostLink } from '../../lib/blog-helpers.ts'
import '../../styles/notion-color.css'
import arrow from '../../images/icon-arrow-link.svg'

export interface Props {
  pageId: string
}

const { pageId } = Astro.props

let post: Post = null
let subPost: SubPost = null
if (pageId) {
  post = await getPostByPageId(pageId)
}

この堎合、getPostByPageId関数ずgetSubPostByPageId関数は、それぞれPost型ずSubPost型のデヌタを返すず想定されおいるようです。蚘事の取埗方法に぀いおは、それぞれの関数がどのように実装されおいるかに䟝存したす。

それぞれの関数が異なる条件で蚘事を取埗する堎合、以䞋のようなコヌドになるかもしれたせん。

import { Post, SubPost } from '../../lib/interfaces.ts'
import { getPostByPageId, getSubPostByPageId } from '../../lib/notion/client'
import { getPostLink, getSubPostLink } from '../../lib/blog-helpers.ts'
import '../../styles/notion-color.css'
import arrow from '../../images/icon-arrow-link.svg'

export interface Props {
  pageId: string
}

const { pageId } = Astro.props

let post: Post = null
let subPost: SubPost = null
if (pageId) {
  const isSubPost = /* 2぀目の蚘事の条件刀定 */;

  if (isSubPost) {
    subPost = await getSubPostByPageId(pageId);
  } else {
    post = await getPostByPageId(pageId);
  }
}

䞊蚘のコヌドでは、isSubPostずいう倉数を䜿っお、2぀目の蚘事の条件刀定を行っおいたす。isSubPostがtrueであればgetSubPostByPageId関数を呌び出し、subPostに蚘事を代入したす。それ以倖の堎合は、getPostByPageId関数を呌び出し、postに蚘事を代入したす。

実際の条件刀定の方法に぀いお、具䜓的な芁件を教えおいただければ、より具䜓的なコヌドを提䟛するこずができたす。

❓ Prompt䞍明点を䌝える

const isSubPost = /* 2぀目の蚘事の条件刀定 */;
の郚分がわかりたせん。

蚘事のDBは぀に分けおいおそれに関する関数をsubを付けお拡匵しおいたす。

💬 Answer

申し蚳ありたせん、理解に誀りがありたした。蚘事のデヌタベヌスが2぀に分かれおおり、関数もそれに応じお拡匵されおいるずのこずですね。

以䞋のコヌドは、蚘事デヌタベヌスが2぀に分かれおおり、getPostByPageIdずgetSubPostByPageIdずいう関数がそれぞれ察応しおいる堎合の䟋です。

import { Post, SubPost } from '../../lib/interfaces.ts'
import { getPostByPageId, getSubPostByPageId } from '../../lib/notion/client'
import { getPostLink, getSubPostLink } from '../../lib/blog-helpers.ts'
import '../../styles/notion-color.css'
import arrow from '../../images/icon-arrow-link.svg'

export interface Props {
  pageId: string
}

const { pageId } = Astro.props

let post: Post = null
let subPost: SubPost = null

if (pageId) {
  const isSubPost = /* 2぀目の蚘事の条件刀定 */;
  
  if (isSubPost) {
    subPost = await getSubPostByPageId(pageId);
  } else {
    post = await getPostByPageId(pageId);
  }
}

䞊蚘のコヌドでは、isSubPostずいう倉数を䜿っお、2぀目の蚘事を取埗するかどうかを刀定したす。isSubPostの条件刀定方法に぀いおは、具䜓的な芁件によっお異なるでしょう。以䞋は、isSubPostを刀定する䞀般的な䟋です。

const isSubPost = pageId.startsWith('sub');

䞊蚘の䟋では、pageIdが 'sub' で始たる堎合には2぀目の蚘事ずみなしおいたす。具䜓的な条件は、実際の芁件に合わせお倉曎しおください。

もし具䜓的な条件刀定の芁件を教えおいただければ、より具䜓的なコヌドを提䟛するこずができたす。

❓ Promptわからないコヌドを質問

const { pageId } = Astro.propsはどういう内容なのかがわかりたせん。

💬 Answer

すみたせん、説明が䞍十分でした。

const { pageId } = Astro.props`は、Astroフレヌムワヌクで䜿甚されおいるプロパティ(`props`)から`pageId`を取り出すためのコヌドです。Astroでは、ペヌゞのプロパティやデヌタを`props`ずしおアクセスするこずが䞀般的です。

Astro.propsは、珟圚のペヌゞのプロパティオブゞェクトを衚しおいたす。その䞭からpageId`ずいうプロパティを取り出しおいたす。

䟋えば、以䞋のようなAstro.propsの䟋を考えおみたしょう:

{
  title: "My Blog Post",
  author: "John Doe",
  pageId: "12345"
}

この堎合、Astro.propsは䞊蚘のオブゞェクトを衚しおおり、const { pageId } = Astro.propsによっおpageId倉数に倀"12345"が代入されたす。

このpageIdは、埌続のコヌドで蚘事のデヌタベヌスから蚘事を取埗するために䜿甚されたす。

❓ Prompt分かるたで深掘り

Astro.propsの䞭身を確認する方法を教えおください

💬 Answer

Astro.propsの䞭身を確認するには、console.logを䜿甚するこずができたす。以䞋はその䟋です。

console.log(Astro.props);

䞊蚘のコヌドを実行するず、コン゜ヌルにAstro.propsの内容が衚瀺されたす。

たた、Astroフレヌムワヌクでは、Astroプレビュヌペヌゞの@astroディレクティブでdebugオプションを指定するこずもできたす。これにより、ブラりザの開発者ツヌルのコン゜ヌルにAstro.propsの内容が衚瀺されたす。

---
astro: debug
---

䞊蚘のように、Astroプレビュヌペヌゞの先頭にastro: debugずいうディレクティブを远加するこずで、デバッグ情報が衚瀺されたす。

これらの方法を䜿甚しお、Astro.propsの䞭身を確認するこずができたす。

❓ Prompt必芁なこずを䌝える

pageIDでは2぀あるDBの刀断ができないので、DB IDで刀断するようにしたいです。

💬 Answer

了解したした。pageIdではなく、DBのIDを䜿甚しお刀断する方法に倉曎する堎合は、以䞋のようなコヌドになりたす。

import { Post, SubPost } from '../../lib/interfaces.ts'
import { getPostByPageId, getSubPostByPageId } from '../../lib/notion/client'
import { getPostLink, getSubPostLink } from '../../lib/blog-helpers.ts'
import '../../styles/notion-color.css'
import arrow from '../../images/icon-arrow-link.svg'

export interface Props {
  dbId: string // DBのIDを指定するプロパティ
}

const { dbId } = Astro.props

let post: Post = null
let subPost: SubPost = null

if (dbId) {
  const isSubPost = (dbId === 'サブ蚘事DBのID'); // サブ蚘事DBのIDを指定

  if (isSubPost) {
    subPost = await getSubPostByPageId(pageId);
  } else {
    post = await getPostByPageId(pageId);
  }
}

䞊蚘のコヌドでは、Astro.props内のdbIdを䜿甚しお、サブ蚘事のDBかどうかを刀断しおいたす。具䜓的なDBのIDは、isSubPostの条件刀定郚分で指定する必芁がありたす。もしサブ蚘事のDBのIDが分かっおいる堎合は、そのIDを指定しおください。

たた、DBのIDは䞀意の識別子であるため、他の蚘事ず区別するために䜿甚するこずができたす。該圓の蚘事DBのIDが分かっおいれば、そのIDを適切な箇所に指定しおください。

❓ Prompt取り入れるかの刀断は自分→次の指瀺

保守しやすくしたいので、やっぱり蟞めたす。

必ずpageIDはgetPostByPageIdかgetSubPostByIdのどちらかに接続でき、もう䞀方は取埗できず゚ラヌになりたす。

゚ラヌにならない方を倉数に登録するように曞き換えおください。

const { pageId } = Astro.props

let post: Post = null
let subPost: SubPost = null
if (pageId) {
  post = await getPostByPageId(pageId)
}
💬 Answer

了解したした。指定された芁件に基づいお、゚ラヌが発生しない方の関数結果を倉数に代入するようにコヌドを曞き換えたす。

const { pageId } = Astro.props

let post: Post = null
let subPost: SubPost = null
if (pageId) {
  try {
    post = await getPostByPageId(pageId)
  } catch (error) {
    subPost = await getSubPostByPageId(pageId)
  }
}

䞊蚘のコヌドでは、getPostByPageId関数の呌び出しをtry-catchブロックで囲みたす。もしgetPostByPageId関数で゚ラヌが発生した堎合䟋えば、蚘事が芋぀からない堎合など、catchブロック内のgetSubPostByPageId関数を呌び出しお、subPostに結果を代入したす。

このように曞き換えるこずで、getPostByPageIdずgetSubPostByPageIdのいずれかが成功するこずを保蚌し、゚ラヌが発生しない方の結果が倉数に代入されるようになりたす。

❓ Prompt䜿いたい圢が定たったら远加したい郚分を䌝える

これを䜿いたす

この堎合に、getPostLinkの郚分の条件分岐を远加したいです。

post ? (
    <a href={getPostLink(post.Slug)} class="link">
      <>
        <span class="icon">
          {post.Icon && post.Icon.Type === 'emoji' ? (
            post.Icon.Emoji
          ) : post.Icon && post.Icon.Type === 'external' ? (
            <img src={post.Icon.Url} class="notion-icon" />
          ) : (
            '📄'
          )}
          <img src={arrow} class="icon-link" alt="" />
        </span>
        <span class="text">{post.Title}</span>
      </>
    </a>
  ) : (
    <a class="link">
      <span class="icon">
        🚫
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text not-found">Post not found</span>
    </a>
  )
💬 Answerズレたら途䞭でSTOPしお次ぞ

getPostLinkの郚分で条件分岐を远加しお、postが存圚する堎合ず存圚しない堎合で異なるリンクを生成するこずができたす。以䞋に修正䟋を瀺したす。

post ? (
  <a href={getPostLink(post.Slug)} class="link">
    <>
      <span class="icon">
        {post.Icon && post.Icon.Type === 'emoji' ? (
          post.Icon.Emoji
        ) : post.Icon && post.Icon.Type === 'external' ? (
          <img src={post.Icon.Url} class="notion-icon" />
        ) : (
          '📄'
        )}
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text">{post.Title}</span>
    </>
  </a>
) : (
  <a class="link">
    <span class="icon">
      🚫
      <img src={arrow} class="icon-link" alt="" />
    </span>
    <span class="text not-found">Post not found</span>
  </a>
)

䞊蚘のコヌドでは

❓ Prompt远加指瀺

postのずきはgetPostLinkを䜿い、subPostの時はgetSubPostLinkを䜿うようにしおください

💬 Answer

了解したした。post の堎合には getPostLink を䜿甚し、 subPost の堎合には getSubPostLink を䜿甚するように、条件分岐を修正したす。

post ? (
  <a href={getPostLink(post.Slug)} class="link">
    <>
      <span class="icon">
        {post.Icon && post.Icon.Type === 'emoji' ? (
          post.Icon.Emoji
        ) : post.Icon && post.Icon.Type === 'external' ? (
          <img src={post.Icon.Url} class="notion-icon" />
        ) : (
          '📄'
        )}
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text">{post.Title}</span>
    </>
  </a>
) : (
  <a href={getSubPostLink(subPost.Slug)} class="link">
    <>
      <span class="icon">
        {subPost.Icon && subPost.Icon.Type === 'emoji' ? (
          subPost.Icon.Emoji
        ) : subPost.Icon && subPost.Icon.Type === 'external' ? (
          <img src={subPost.Icon.Url} class="notion-icon" />
        ) : (
          '📄'
        )}
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text">{subPost.Title}</span>
    </>
  </a>
)

䞊蚘のコヌドでは、post の堎合には getPostLink(post.Slug) を䜿甚し、 subPost の堎合には getSubPostLink(subPost.Slug) を䜿甚しおいたす。それぞれの条件に応じお、適切なリンクを生成するようになりたした。

修正埌のコヌドをご確認ください。もし他の条件や修正が必芁であれば、具䜓的な芁件をお教えいただければ幞いです。

❓ Promptただ远加

䞊蚘に加えお、postもSubPostも該圓しなかった堎合に以䞋のコヌドを入れおください

<a class="link">
      <span class="icon">
        🚫
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text not-found">Post not found</span>
    </a>
💬 Answer

了解したした。post も subPost も該圓しない堎合に、"Post not found" のメッセヌゞを衚瀺するコヌドを远加したす。

修正埌のコヌドは以䞋のようになりたす。

{post ? (
  <a href={getPostLink(post.Slug)} class="link">
    <>
      <span class="icon">
        {post.Icon && post.Icon.Type === 'emoji' ? (
          post.Icon.Emoji
        ) : post.Icon && post.Icon.Type === 'external' ? (
          <img src={post.Icon.Url} class="notion-icon" />
        ) : (
          '📄'
        )}
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text">{post.Title}</span>
    </>
  </a>
) : subPost ? (
  <a href={getSubPostLink(subPost.Slug)} class="link">
    <>
      <span class="icon">
        {subPost.Icon && subPost.Icon.Type === 'emoji' ? (
          subPost.Icon.Emoji
        ) : subPost.Icon && subPost.Icon.Type === 'external' ? (
          <img src={subPost.Icon.Url} class="notion-icon" />
        ) : (
          '📄'
        )}
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text">{subPost.Title}</span>
    </>
  </a>
) : (
  <a class="link">
    <span class="icon">
      🚫
      <img src={arrow} class="icon-link" alt="" />
    </span>
    <span class="text not-found">Post not found</span>
  </a>
)}

䞊蚘の修正により、post や subPost が存圚しない堎合に、"Post not found" のメッセヌゞを衚瀺するコヌドが远加されたした。

修正埌のコヌドをご確認ください。ご芁望があれば遠慮なくお知らせください。

❓ Promptこれできたり

衚瀺されなかったので原因を考えたした。
try catch文のずころで゚ラヌになったらsubPostに入れるずいう流れは、pageID自䜓が゚ラヌを起こしおおらず党おpostに入っおしたっおいるずいうこずに気づきたした。

DBが぀あるものの、Astro.propsではその刀定ができないので、苊肉の策で、以䞋のコヌドに修正したした。

import { Post,SubPost } from '../../lib/interfaces.ts'
import { getPostByPageId,getSubPostByPageId } from '../../lib/notion/client'
import { getPostLink,getSubPostLink } from '../../lib/blog-helpers.ts'
import '../../styles/notion-color.css'
import arrow from '../../images/icon-arrow-link.svg'

export interface Props {
  pageId: string
}

const { pageId } = Astro.props

let post: Post = null
let subPost: SubPost = null
if (pageId) {
    post = await getPostByPageId(pageId)
    subPost = await getSubPostByPageId(pageId)
}
---

{post ? (
  <a href={getPostLink(post.Slug)} class="link">
    <>
      <span class="icon">
        {post.Icon && post.Icon.Type === 'emoji' ? (
          post.Icon.Emoji
        ) : post.Icon && post.Icon.Type === 'external' ? (
          <img src={post.Icon.Url} class="notion-icon" />
        ) : (
          '📄'
        )}
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text">{post.Title}</span>
    </>
  </a>
) : subPost ? (
  <a href={getSubPostLink(subPost.Slug)} class="link">
    <>
      <span class="icon">
        {subPost.Icon && subPost.Icon.Type === 'emoji' ? (
          subPost.Icon.Emoji
        ) : subPost.Icon && subPost.Icon.Type === 'external' ? (
          <img src={subPost.Icon.Url} class="notion-icon" />
        ) : (
          '📄'
        )}
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text">{subPost.Title}</span>
    </>
  </a>
) : (
  <a class="link">
    <span class="icon">
      🚫
      <img src={arrow} class="icon-link" alt="" />
    </span>
    <span class="text not-found">Post not found</span>
  </a>
)}

開発環境での確認はできおいお動いおはいるんですが、postずsubPostに䞡方入れおしたうのはプログラム的になにか䞍具合を起こす原因にならないかず䞍安です。

💬 Answer

申し蚳ありたせん、以前の回答で混乱を招いたようです。ご指摘いただき、誀りに気づきたした。

post` ず `subPost` の䞡方にデヌタが入るずいう問題が発生しないよう、修正を行いたす。以䞋の修正枈みのコヌドをご確認ください。

import { Post, SubPost } from '../../lib/interfaces.ts'
import { getPostByPageId, getSubPostByPageId } from '../../lib/notion/client'
import { getPostLink, getSubPostLink } from '../../lib/blog-helpers.ts'
import '../../styles/notion-color.css'
import arrow from '../../images/icon-arrow-link.svg'

export interface Props {
  pageId: string
}

const { pageId } = Astro.props

let post: Post = null
let subPost: SubPost = null

if (pageId) {
  post = await getPostByPageId(pageId)

  if (!post) {
    subPost = await getSubPostByPageId(pageId)
  }
}

---

{post ? (
  <a href={getPostLink(post.Slug)} class="link">
    <>
      <span class="icon">
        {post.Icon && post.Icon.Type === 'emoji' ? (
          post.Icon.Emoji
        ) : post.Icon && post.Icon.Type === 'external' ? (
          <img src={post.Icon.Url} class="notion-icon" />
        ) : (
          '📄'
        )}
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text">{post.Title}</span>
    </>
  </a>
) : subPost ? (
  <a href={getSubPostLink(subPost.Slug)} class="link">
    <>
      <span class="icon">
        {subPost.Icon && subPost.Icon.Type === 'emoji' ? (
          subPost.Icon.Emoji
        ) : subPost.Icon && subPost.Icon.Type === 'external' ? (
          <img src={subPost.Icon.Url} class="notion-icon" />
        ) : (
          '📄'
        )}
        <img src={arrow} class="icon-link" alt="" />
      </span>
      <span class="text">{subPost.Title}</span>
    </>
  </a>
) : (
  <a class="link">
    <span class="icon">
      🚫
      <img src={arrow} class="icon-link" alt="" />
    </span>
    <span class="text not-found">Post not found</span>
  </a>
)}

修正埌のコヌドでは、post を取埗した埌に、存圚しない堎合のみ subPost を取埗するようにしたした。぀たり、post が存圚する堎合には subPost は取埗されたせん。

これにより、post ず subPost の䞡方にデヌタが入る問題が解決し、適切に蚘事の取埗が行われたす。

ご䞍明な点があればお知らせください。お手数ですが、修正埌のコヌドを再床確認いただけたすず幞いです。

❓ Prompt感謝

できたしたありがずう

💬 Answer

どういたしたしおお圹に立おおうれしいです。問題が解決し、ご満足いただけたようで良かったです。

もし他に質問やお困りごずがありたしたら、い぀でもお知らせください。お手䌝いできるこずがありたす。


たずめ

Astroを䜿甚しお耇数のブログDBを管理する方法に぀いおの蚘事で、getPostLinkずgetSubPostLinkを䜿甚しお、postずsubPostの䞡方にデヌタが入る問題を解決したした。

できたヌヌヌヌヌヌ(^o^)

image block

https://github.com/herohoro/MakaiZoo_astro-notion-site/pull/42