⚡
Supabaseでuseswrを使ってみる。
Supabase で swr 使いたく、やってみたのでまとめ。
参考 🐈 Github
SWR
Supabase
-
プロジェクト内に
pages/api
フォルダを作成し、supabase からデータ取得する処理を書く。 -
useSWR を使って、
pages/api
からデータを取得する。
0.supabase のクライアントの設定
公式サイトのリファレンスを参考に設定していく。
インストールする。
npm install @supabase/supabase-js
src
フォルダ内にlib
フォルダを作成する。
プロジェクトのディレクトリ直下に.env.local
を作成し、ここで URL と KEY を設定する。
gignore
に.env.local
が追加されていることを確認する。
lib/supabase
import { createClient } from "@supabase/supabase-js";
// 環境変数のロード
const SUPABASE_URL = process.env.NEXT_PUBLIC_SUPABASE_URL;
const SUPABASE_KEY = process.env.NEXT_PUBLIC_SUPABASE_KEY;
// URLの環境変数が設定されていなかったらエラー
if (!SUPABASE_URL) {
throw new Error("Missing env.NEXT_PUBLIC_SUPABASE_URL");
}
// KEYの環境変数が設定されていなかったらエラー
if (!SUPABASE_KEY) {
throw new Error("Missing env.NEXT_PUBLIC_SUPABASE_KEY");
}
export const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
env
NEXT_PUBLIC_SUPABASE_URL = あなたのURL
NEXT_PUBLIC_SUPABASE_KEY = あなたのKEY
pages/api
フォルダを作成し、supabase からデータ取得する処理を書く。
1. API ルートを機能させるため、関数をデフォルトとしてエクスポートする必要がある。
supabase/pages/api
import { NextApiRequest, NextApiResponse } from 'next';
import { supabase } from '../../lib/Supabase';
const getAirportAPI = async (req: NextApiRequest, res: NextApiResponse) => {
const { data, error } = await supabase.from('tabal名').select();
// 401 Unauthorized、認証が必要
if (error) return res.status(401).json({ error: error.message });
// 200番台は、処理が成功して正常にレスポンスができている状態
return res.status(200).json(data);
};
<!-- 必ずデフォルトとしてエクスポートする -->
export default getAirportAPI;
pages/api
からデータを取得する。
2. useSWR を使って、表示するページで呼び出す。
useSWR(アクセス先,関数,オプション)で記述する。
index
import useSWR, { SWRConfig } from 'swr';
import { supabase } from '../lib/Supabase';
const fetcher = (...args) => fetch(...args).then((res) => res.json());
export default function App() {
// useSWR(アクセス先,関数,オプション)
const { data, error } = useSWR('../api/supabase', fetcher, { refreshInterval: 1000 });
// データがとれているか確認する
console.log(data);
if (error) return <div>failed to load</div>;
if (!data) return <div>loading...</div>;
// 各々のデータの形に応じて変更する
return <div>hello {data[0].name}!</div>;
}
3. もっと実践!
useSWR で呼出す処理を分ける。
useAirport
という関数を作成する。
Supabase に空港のデータベースを作成。
./api/airport
に Supabase に接続する処理を作っておく。
useAirport
で./api/airport
からデータ取得する。
supabase/pages/api/airport
import { NextApiRequest, NextApiResponse } from 'next';
import { supabase } from '../../lib/Supabase';
const getAirportAPI = async (req: NextApiRequest, res: NextApiResponse) => {
// .select();で全カラム取得、.select(カラム名)で選択も可能
const { data, error } = await supabase.from('airport').select();
// 401 Unauthorized、認証が必要
if (error) return res.status(401).json({ error: error.message });
// 200番台は、処理が成功して正常にレスポンスができている状態
return res.status(200).json(data);
};
<!-- 必ずデフォルトとしてエクスポートする -->
export default getAirportAPI;
index
// fetcherの記述
const fetcher = (...args) => fetch(...args).then((res) => res.json());
// useAirportという関数をつくる
export const useAirport = () => {
// useSWR(アクセス先,関数,オプション)
const { data, error } = useSWR('./api/airport', fetcher);
return {
airportData: data,
isLoading: !error && !data,
isError: error,
};
};
export default function App() {
// useAirportで返す値を格納する
const { airportData, isLoading } = useAirport();
// isLoadingのときはロード中!!を表示する
if (isLoading) return <p>ロード中!!</p>;
return (
<>
// airportDataを使った内容の記述
:::
:::
:::
</>
);
}
まとめ
Discussion