コンテンツにスキップ

Astro

ターミナルウィンドウ
npm install @spacepost/node
.env
SPACEPOST_API_KEY=sp_live_YOUR_API_KEY

Astro では、サーバー専用の変数を import.meta.env 経由で利用できます。

src/pages/api/contact.ts
import type { APIRoute } from "astro";
import { SpacePost } from "@spacepost/node";
export const prerender = false; // needs an adapter (output: "server" or "hybrid")
const spacepost = new SpacePost(import.meta.env.SPACEPOST_API_KEY);
export const POST: APIRoute = async ({ request }) => {
const { email, message } = await request.json();
const { data, error } = await spacepost.emails.send({
from: "Acme <hello@acme.com>",
to: ["support@acme.com"],
replyTo: email,
subject: "New contact message",
text: message,
});
if (error) return Response.json(error, { status: error.statusCode ?? 500 });
return Response.json(data);
};

Astro Action として実装することもできます。

src/actions/index.ts
import { defineAction, ActionError } from "astro:actions";
import { z } from "astro:schema";
import { SpacePost } from "@spacepost/node";
const spacepost = new SpacePost(import.meta.env.SPACEPOST_API_KEY);
export const server = {
contact: defineAction({
accept: "form",
input: z.object({ email: z.string().email(), message: z.string().min(1) }),
handler: async ({ email, message }) => {
const { error } = await spacepost.emails.send({
from: "Acme <hello@acme.com>",
to: "support@acme.com",
replyTo: email,
subject: "New contact message",
text: message,
});
if (error) throw new ActionError({ code: "INTERNAL_SERVER_ERROR", message: error.message });
return { ok: true };
},
}),
};