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
は、ファイル名を使用title
とdescription
は、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
で使用するものも含まれているため共通で使えるようにしています。