본문을 마크다운으로 가져오기

notion-to-md npm 모듈을 사용해서 Notion 페이지를 마크다운으로 변경할 수 있다. notion-to-md 모듈과 @notionhq/client 모듈이 필요하다. 그리고 Notion API key페이지 ID도 필요하다. 변환한 마크다운은 toMarkdownString 함수로 문자열로 변환할 수 있다.

const { Client } = require('@notionhq/client');
const { NotionToMarkdown } = require('notion-to-md');

const notion = new Client({ auth: NOTION_KEY });
const n2m = new NotionToMarkdown({ notionClient: notion });
const pageId = PAGE_ID;

(async () => {
  const mdblocks = await n2m.pageToMarkdown(pageId);
  const mdString = n2m.toMarkdownString(mdblocks);
  console.log(mdString);
})();

마크다운을 HTML로 변환

react-markdown npm 모듈을 사용해서 간단하게 변환할 수 있다.

import ReactMarkdown from 'react-markdown';

export default function NotionMD({ markdown }) {
  return (
    <ReactMarkdown>
      {markdown}
    </ReactMarkdown>
  );
}

notion 페이지에서 제목 가져오기

제목은 Notion-to-MD에서 제공하지 않으므로, 다른 방법으로 가져와야 한다. @notionhq/client 를 사용해서 가져온다. (참고로, @notionhq/client 모듈은 타입스크립트 지원이 후지다. 선언된 타입들이 많이 잘못되어 있으므로, any로 변환해서 사용한다.)

async function getPageTitle(pageID: string) {
  if (isDev()) {
    const title = getNotionPageTitleMock(pageID);
    if (title) return title;
  }
  const { properties } = (await notion.pages.retrieve({ page_id: pageID })) as any;
  return properties[properties['title'] ? 'title' : '이름'].title[0].plain_text;
}

이슈

nextjs에서 사용할 때 encoding 모듈이 없다는 경고 출력