ブログ一覧に戻る

Nuxt3で外部APIを呼び出せなかった時の対応策

Nuxt3Vue3

みなさんこんにちは!
イザナギです!


import type { IncomingMessage, ServerResponse } from "http";
import axios from 'axios'
import config from '#config'

let url: string = `https://${config.MICRO_CMS_SERVICE_DOMAIN}.microcms.io/api/v1/blog`
const API_HEAD = {
  headers: {
    "X-MICROCMS-API-KEY": config.MICRO_CMS_API_KEY,
  }
}

export default async (req: IncomingMessage, res: ServerResponse) => {
  if (req.method != 'GET') {
    console.log(req.method)
    res.statusCode = 500
    res.end()
  }


  let data: Array
  await axios.get(
    `${url}`,
    API_HEAD
  ).then(res => {
    data = res.data;
  });
  const json = JSON.stringify(data)

  res.statusCode = 200
  res.setHeader('Content-Type', 'application/json')
  res.end(json)
}


<template>
    <v-container id="blog_caloucel_box" class="mx-auto">
        <h2 class="text-center text-h2">Latest Article</h2>
        <swiper
            :modules="modules"
            :slides-per-view="views"
            :autoplay="{ disableOnInteraction: false, }"
        >
            <swiper-slide v-for="content in data['contents']" :key="content.id">
                <a :href="`/blog/articles/${content.id}`">
                    <picture>
                        <source :srcset="`${content.thumbnail.url}?fm=webp&h=${imageWidth}`" />
                        <img :src="`${content.thumbnail.url}?h=${imageWidth}`" />
                    </picture>
                    <p>{{ content.title }}</p>
                </a>
            </swiper-slide>
        </swiper>
    </v-container>
</template>

<script>
// import Swiper core and required modules
import { A11y, Autoplay } from 'swiper';

// Import Swiper Vue.js components
import { Swiper, SwiperSlide } from 'swiper/vue';

// Import Swiper styles
import 'swiper/css';

// Import Swiper styles
export default {
    components: {
        Swiper,
        SwiperSlide,
    },
    setup() {
        let views = ref(0);
        let { data } = useFetch("/api/microcms")

        const imageWidth = ref(300);


        const calculateWindowWidth = () => {
            let windowWidth = window.innerWidth
            views.value = Math.floor(windowWidth / imageWidth.value)
        }

        onMounted(() => {
            calculateWindowWidth();
            window.addEventListener('resize', calculateWindowWidth)
        })

        onBeforeUnmount(() => {
            window.addEventListener('resize', calculateWindowWidth)
        })


        return {
            modules: [A11y, Autoplay],
            data,
            views,
            imageWidth,
        };
    },
};
</script>

<style lang="scss" scoped>
img {
    width: 100%;
    height: 200px;
    position: relative;
}

p {
    position: absolute;
    color: white;
    top: 75%;
    width: 100%;
    margin: 0;
    padding: 0;
    height: 22%;
    background-color: rgba(129, 212, 250, 0.5);
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    overflow: hidden;
    text-overflow: ellipsis;
}

@media screen and (max-width: 600px) {
    p {
        top: 85%;
        -webkit-line-clamp: 1;
    }
}

h2 {
    margin-bottom: 10vw;
    font-family: Great Vibes !important;
}

#blog_caloucel_box {
    // max-width: 80%;
    // margin: 0 auto;
    padding: 0 10px;
    margin-bottom: 100px;
    margin-top: 20vw;
}
</style>


うまく表示できてますね!
そしてちゃっかり、Swiper8も使えることも確認!
さてどんどんブログの作成進めていきますか〜


const config = useRuntimeConfig();
let url: string = `https://${config.MICRO_CMS_SERVICE_DOMAIN}.microcms.io/api/v1/blog`

export default defineEventHandler(async (event) => {

  const q = getQuery(event);

  const post_id: string = !!q.id ? "/" + q.id : "";
  const post_offset = !!q.offset ? q.offset : "";
  const post_limit = !!q.limit ? q.limit : "10";
  const post_order = !!q.order ? q.order : "";
  const post_fields = !!q.fields ? q.fields : "";
  const filter = q.filter ? `${q.filterKeyName}[contains]${q.filter}` : "";
  const query = !!q.query ? q.query : "";

  const parameters: string = `${post_id}?fields=${post_fields}&filters=${filter}&limit=${post_limit}&offset=${post_offset}&orders=${post_order}&q=${query}`;
  const ENDPOINT: string = url + encodeURI(parameters);

  let data: unknown;

  await $fetch(`${ENDPOINT}`, {
    method: "GET",
    headers: {
      "X-MICROCMS-API-KEY": config.MICRO_CMS_API_KEY,
      'Content-Type': 'application/json',
      'Accept-Encoding': 'gzip',
      'Accept-Charset': 'utf-8',
      'Content-Encoding': 'gzip',
    }
  }
  ).then((response) => {
    data = response
  })

  const json = data

  return json;
})

関連記事

この記事に関連するおすすめです。