Nextjs middleware not redirecting server function invocations
Unanswered
Giant panda posted this in #help-forum
Giant pandaOP
I stumbled this situation in Nextjs App router. I have middleware which inside has following code:
This normally works e.g. when navigating from URL.
Now, when I arrive at the above middleware when a server function is invoked, the redirect does not happen (although it enters inside
Is this normal behavior? What options do I have in such situation?
[This](https://github.com/vercel/next.js/discussions/64993) is related. I think they suggest there to not handle the server functions in middleware, but then question comes, how to know from middleware if this is a server function or not? IMHO server functions don't start with "api" to check that as one user suggested.
EDIT: it seems in above link the suggestion checks header instead of "api" to bypass server functions in middleware. I will verify that solution when I get to PC and close this if that works.
// If user is on protected route and has no session redirect to login page.
if (isProtectedRoute && !session) {
return NextResponse.redirect(new URL("/login", req.nextUrl));
}
This normally works e.g. when navigating from URL.
Now, when I arrive at the above middleware when a server function is invoked, the redirect does not happen (although it enters inside
if
) and also the server function which trigerred this middleware call is not invoked returning undefined
. See below: startTransition(async () => {
// Invoke the server function, this triggers middleware too - and inside middleware redirect is called
// but redirect does not happen and the addMovie never gets called, returns undefined here
const result = await addMovie(data);
// Then due to result being undefined I get error here
setMessage(result.error ? result.error : result.data);
});
Is this normal behavior? What options do I have in such situation?
[This](https://github.com/vercel/next.js/discussions/64993) is related. I think they suggest there to not handle the server functions in middleware, but then question comes, how to know from middleware if this is a server function or not? IMHO server functions don't start with "api" to check that as one user suggested.
EDIT: it seems in above link the suggestion checks header instead of "api" to bypass server functions in middleware. I will verify that solution when I get to PC and close this if that works.
2 Replies
Server actions should have their own auth checks, do not rely on middleware for it.
async function addMovie(){
const session = await getSession();
// handle case where no session or whatever check you need to do
if(!session) redirect(“/…”);
// continue with your logic
}
Giant pandaOP
@LuisLl No that's not the problem, the problem is due to middleware redirect (which also does not seem to work) the server function never gets called.