Site cover image
📮AstroコンポーネントでGETとPOSTを扱う

JavaScriptフレームワークのひとつ「Astro」は、そのシンプルさと学習コストの低さで最近注目を集めています。

Astroはアップデートが活発な反面、公式ドキュメントの整備や日本語訳が追いついていないことから、実はできるのにあまり知られていないことがいくつかあります。

AstroコンポーネントにおけるGETパラメータやPOSTデータの扱いもそのひとつです。

APIルートでこれらを扱う方法は公式ドキュメントで説明されていますが、Astroコンポーネントで扱う方法はよく探さないと知ることができません。

そこでこの記事ではAstroコンポーネントでGETパラメータやPOSTデータを扱う方法を説明します。

AstroコンポーネントでGETパラメータやPOSTデータを扱うには、前提としてサーバーサイドレンダリング(SSR)を有効にしておく必要があります。

下記の公式ドキュメントを参照してSSRの有効化を設定しておきましょう。

Astroではリクエストオブジェクトに対して Astro.request を使ってアクセスすることができます。

Astro.request はJavaScript標準の Request インターフェースです。したがって Astro.request.method を使ってHTTPメソッドを判定することができます。

GETの場合は 'GET' に、POSTの場合は 'POST' になります。

実は、Astro自体にGETパラメータを取得するための特別なメソッドが用意されているわけではありません。

HTTPメソッドと同じように、リクエストURLは Request インターフェースの url プロパティから得られるためこれを利用します。

つまり Astro.request.url がクエリパラメータを含むURLを文字列で返すので、JavaScript標準の URL インターフェースを使ってGETパラメータ(クエリパラメータ)を取り出します。

例えば search_key というパラメータを取り出すには下記のようにします。

let searchKey = '';

if (Astro.request.method === 'GET') {
  const url = new URL(Astro.request.url);
  const params = new URLSearchParams(url.search);
  searchKey = params.get('search_key');
}
URLインターフェースを使ってAstro.request.urlからGETパラメータを取得する

Astroコンポーネント全体は下記のようになります。

外部入力を受け付けるため try...catch を使って例外処理を行なっています。

---
let searchKey = '';

try {
  if (Astro.request.method === 'GET') {
    const url = new URL(Astro.request.url);
    const params = new URLSearchParams(url.search);
    searchKey = params.get('search_key');
  }
} catch (error) {
  console.error(error);
}
---

<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>GETパラメータのテスト</title>
  </head>
  <body>
    <p>search_key: {searchKey}</p>
  </body>
</html>
AstroコンポーネントでGETパラメータを扱うコード例

次はAstroコンポーネントでPOSTデータを扱ってみましょう。

AstroでPOSTデータを扱うには、GETと同じく Astro.request から Request オブジェクトを参照する必要があります。

Request インターフェースにはフォームデータを得るための Request.formData() メソッドが用意されているため、これを Astro.request.formData() のように呼び出し FormData オブジェクトを得た後、 formData.get('username') のようにして値を取得します。

例えば username という名前のデータを得るには次のようにします。

Request.formData() メソッドはプロミスを返すため await が必要であることに注意しましょう。

let username = '';

if (Astro.request.method === 'POST') {
  const formData = await Astro.request.formData();
  username = formData.get('username');
}
FormDataオブジェクトを取得した後、値を取得する

Astroコンポーネント全体は下記のようになります。

フォームの値は文字列以外にバイナリ形式(Blob)になる可能性があるため、オブジェクトの種類をチェックする必要があります。

---
const handledErrors = ['invalid username'];

let username = '';
let errorMessage = '';

try {
  if (Astro.request.method === 'POST') {
    const formData = await Astro.request.formData();
    username = formData.get('username');

    if (typeof username !== 'string' || username === '') {
      throw new Error('invalid username');
    }
  }
} catch (error) {
  if (error instanceof Error && handledErrors.includes(error.message)) {
    errorMessage = error.message;
  } else {
    console.error(error);
  }
}
---

<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>POSTデータのテスト</title>
  </head>
  <body>
    <h1>Form</h1>
    {Astro.request.method === 'POST' && errorMessage === '' ? (
      <p>ユーザー名は {username} です</p>
    ) : (
      <form action="/" method="post">
        <label>
          ユーザー名:
          <input type="text" name="username" />
        </label>
        {errorMessage === 'invalid username' && (<p>ユーザー名を入力してください</p>)}
        <button type="submit">Submit</button>
      </form>
    )}
  </body>
</html>
AstroコンポーネントでPOSTデータを扱うコード例

今回紹介したAstroコンポーネントでPOSTデータを扱う方法は公式ドキュメントでは下記でレシピとして紹介されています。

以上です。

この記事ではAstroコンポーネントでGETパラメータやPOSTデータを扱う方法を説明しました。


💕
記事が参考になったら少額を寄付いただけると励みになります。
Thank you!
Thank you!
URLをコピーしました

コメントを送る

コメントはブログオーナーのみ閲覧できます