かめ。ブログ

mdxファイルを取得してAlgoliaに登録するNodeの処理

2024年1月15日
2024年1月15日

目次

必要なnpm

package.json

  "scripts": {
    "generateMdxToAlgolia": "node ./src/utils/server/generateMdxToAlgolia",
  },

build時に、合わせて実行するようにしておくと良いでnpす。

.env

SITE_DOMAIN=サイトのドメイン
NEXT_PUBLIC_ALGOLIA_APPLICATION_ID=AlgoliaアプリケーションID
ALGOLIA_ADMIN_API_KEY=Algolia管理APIキー
NEXT_PUBLIC_ALGOLIA_INDEX=Algoliaインデックス

generateMdxToAlgolia

const path = require('path');
const fs = require('fs');
const algoliasearch = require('algoliasearch');

const postDir = path.join(process.cwd(), `src/log`);

const generateMdxToAlgolia = async () => {
  if (
    !process.env.SITE_DOMAIN ||
    !process.env.NEXT_PUBLIC_ALGOLIA_APPLICATION_ID ||
    !process.env.ALGOLIA_ADMIN_API_KEY ||
    !process.env.NEXT_PUBLIC_ALGOLIA_INDEX
  ) {
    return;
  }

  const htmlTagRegex = /<("[^"]*"|'[^']*'|[^'">])*>/g;

  const objects = fs
    .readdirSync(`${postDir}/`)
    .filter((file) => {
      return path.extname(file).toLowerCase() === '.mdx';
    })
    .map((path) => {
      const fileName = path.replace(/\.mdx$/, '');
      const text = fs.readFileSync(`${postDir}/${path}`, 'utf8');
      const title = text.match(/title: (.*)/);
      const description = text.match(/description: (.*)/);

      return {
        objectID: fileName,
        type: 'log',
        title: title ? title[1] : '',
        description: description ? description[1] : '',
        url: `https://${process.env.SITE_DOMAIN}/log/${fileName}`,
        content: text.replace(htmlTagRegex, '').replace(/\r\n|\r|\n/g, ' '),
      };
    });

  const client = algoliasearch(
    process.env.NEXT_PUBLIC_ALGOLIA_APPLICATION_ID,
    process.env.ALGOLIA_ADMIN_API_KEY
  );
  const index = client.initIndex(process.env.NEXT_PUBLIC_ALGOLIA_INDEX);
  await index.saveObjects(objects, { autoGenerateObjectIDIfNotExist: true });
};

generateMdxToAlgolia();

  • objectIDは、ファイル名を使用
  • titledescriptionは、mdxファイルのfrontmatterの記述方法を想定しています。

実行方法

NEXT_PUBLIC_ALGOLIA_APPLICATIO_IDN=${APPLICATIO_IDN} ALGOLIA_ADMIN_API_KEY=${ALGOLIA_ADMIN_API_KEY} NEXT_PUBLIC_ALGOLIA_INDEX=${ALGOLIA_INDEX} SITE_DOMAIN=${SITE_DOMAIN} npm run generateMdxToAlgolia

NEXT_PUBLICとなっているのは、Nextで使用するものも含まれているため共通で使えるようにしています。



関連する記事