Add middleware to persist form actions in session and follow POST-REDIRECT-GET

form submission pattern
This commit is contained in:
badblocks 2026-01-22 14:05:29 -08:00
parent f2f42a84b5
commit f7bdfd3cb8
No known key found for this signature in database

46
src/middleware.ts Normal file
View file

@ -0,0 +1,46 @@
import { defineMiddleware } from "astro:middleware";
import { getActionContext } from "astro:actions";
import { randomUUID } from "node:crypto";
export const onRequest = defineMiddleware(async (context, next) => {
if (context.isPrerendered) return next();
const { action, setActionResult, serializeActionResult } =
getActionContext(context);
const currentAction = await context.session?.get("currentAction");
if (currentAction) {
const { actionName, actionResult } = JSON.parse(currentAction);
setActionResult(actionName, actionResult);
context.session?.delete("currentAction");
return next();
}
if (action?.calledFrom === "form") {
const actionResult = await action.handler();
context.session?.set(
"currentAction",
JSON.stringify({
actionName: action.name,
actionResult: serializeActionResult(actionResult),
}),
);
if (actionResult.error) {
const referer = context.request.headers.get("Referer");
if (!referer) {
throw new Error(
"Internal: Referer unexpectedly missing from Action POST request.",
);
}
return context.redirect(referer);
}
return context.redirect(context.originPathname);
}
return next();
});