やりたいこと
フロントエンドで動いているJSから、Remixのサーバーサイドを経由してバックエンドAPIを叩きたい。

結論
Remixの app/routes
ディレクトリに .tsx
ファイルを作成し、loader,action関数だけ配置すれば良い。
手順(GETの場合)
今回は /api/posts
というプロキシAPIのエンドポイントをRemixに作成する。
1. tsxファイルを作成
app/routes/api.posts.tsx
を作成する。
interface Post {
id: number;
title: string;
}
export const loader = async (): Promise<Post[]> => {
const response = await fetch('https://jsonplaceholder.typicode.com/posts');
const posts = (await response.json()) as Post[];
return posts;
}
今回はほんとうにただプロキシしているだけだが、実務ではこのloader関数の中でユーザー情報を呼び出して認証したりすることが想定される。
2. 動作確認
http://jsonplaceholder.typicode.com/posts
にリクエストしたものと全く同じ結果が得られることがわかる。

手順(POSTの場合)
/api/posts
というプロキシエンドポイントを作成する。
1. tsxファイルを作成
app/routes/api.posts.tsx
ファイルを作成。
import { ActionFunctionArgs } from "@remix-run/node";
export async function action({ request }: ActionFunctionArgs) {
// リクエストボディは`.json()`で取得可能
const body = await request.json();
const response = await fetch("https://jsonplaceholder.typicode.com/posts", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ ...body }), // リクエストされたものをそのままバックポスト
});
return response;
}
2. 動作確認
リクエストボディを含めてPOSTリクエストを送信する。

レスポンスが返却されることが確認できる。
