iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
自我挑戰組

中年大叔(40+)前端自學筆記系列 第 25

DAY25 - 從cms的資料庫撈資料到前端 4 (end)

  • 分享至 

  • xImage
  •  

前言:

lib\reviews.js 裡面的 getReview getReviews 兩隻函式有很多重複的地方
另外寫一隻函數來取代,重複的地方有兩個,拆成兩隻函數(如下圖所示)


前略

// 導入 CMS 後 改寫的函式 getReview  重構
export async function getReview(slug) {
    const { data } = await fetchReviews({
        filters: { slug: { $eq: slug } },
        fields: ["slug", "title", "subtitle", "publishedAt", "body"],
        populate: { image: { fields: ["url"] } },
        pagination: { pageSize: 1, withCount: false },
    });
    const item = data[0];
    return {
        ...toReview(item),
        body: marked(item.attributes.body, { headIds: false, mangle: false }),
    };
}

// 導入 CMS 後 改寫的函式 getReviews 重構
export async function getReviews() {
    const { data } = await fetchReviews({
        fields: ["slug", "title", "subtitle", "publishedAt"],
        populate: { image: { fields: ["url"] } },
        sort: ["publishedAt:desc"],
        pagination: { pageSize: 6 },
    });

    return data.map(toReview);
}


// 拆成兩隻獨立的函數 如下
// 重構

async function fetchReviews(parameters) {
    const url =
        `${CMD_URL}/api/reviews` +
        "?" +
        qs.stringify(parameters, { encodeValuesOnly: true });
    console.log("fetchReviews =", url);
    const response = await fetch(url);
    if (!response.ok) {
        throw new Error(`CMS return ${response.status} for ${url}`);
    }
    return await response.json();
}

// 重構 2

function toReview(item) {
    const { attributes } = item;
    return {
        slug: attributes.slug,
        title: attributes.title,
        date: attributes.publishedAt.slice(0, "yyy-mm-dd".length),
        image: CMD_URL + attributes.image.data.attributes.url,
    };
}


最後一個部分

原本的 getSlugs()

export async function getSlugs() {
  const files = await readdir('./content/reviews');
  return files.filter((file) => file.endsWith('.md'))
    .map((file) => file.slice(0, -'.md'.length));

後來改寫的

export async function getSlugs() {
    const { data } = await fetchReviews({
        fields: ["slug"],
        sort: ["publishedAt:desc"],
        pagination: { pageSize: 100 },
    });

    return data.map((item) => item.attributes.slug);
}

以上就把原本在本地端讀取的資料,全部改成Strapi後端的資料


大叔的鐵人賽第二十五天結束 :)


上一篇
DAY24 - 從cms的資料庫撈資料到前端 3
下一篇
DAY26 - Static Build with CMS Data
系列文
中年大叔(40+)前端自學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言