Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AWS Amplify and Next.JS with GraphQL Server Error No current user from getStaticPaths

I'm having trouble accessing data from Amplify's API Graphql, and it keeps returning

Server Error
Error: No current user

I've been following this tutorial: https://youtu.be/13nYLmjZ0Ys?t=2292

I know I'm signed into Amplify because if I go into different pages, I can grab user Auth and I can even display the SignOut button. But for whatever reason, I'm not sure why I'm getting this error

import { API } from "aws-amplify";
import { useRouter } from "next/router";
import { listActivations, getActivation } from "../../graphql/queries";

const Activation = ({ activation }) => {
  const router = useRouter();
  if (router.isFallback) {
    return <div>Loading</div>;
  }
  return <div>{activation.title}</div>;
};
export default Activation;

export async function getStaticPaths() {
  const SSR = withSSRContext();
  console.log("static paths");
  const activationData = await SSR.API.graphql({
    query: listActivations,
  });
  console.log("activationData", activationData);
  const paths = activationData.data.listActivations.items.map((activation) => ({
    params: { id: activation.id },
  }));
  return {
    paths,
    fallback: true,
  };
}

export async function getStaticProps({ params }) {
  const SSR = withSSRContext(); // added SSR, but still getting error
  console.log("static props");
  const { id } = params;
  const activationData = await SSR.API.graphql({
    query: getActivation,
    variables: { id },
  });
  return {
    props: {
      activation: activationData.data.getActivation,
    },
  };
}

The console log static paths appears, and then after that, I get errors.

Do you think it has anything to do with my GraphQL schema?

type User @model @auth(rules: [{ allow: owner, ownerField: "username" }]) {
  id: ID!
  username: String!
  email: String!
  userType: UserType
}

type Activation
  @model
  @key(
    name: "activationsByStudentId"
    fields: ["student"]
    queryField: "activationsByStudentId"
  )
  @auth(
    rules: [
      { allow: groups, groups: ["Admin"] }
      { allow: owner }
      {
        allow: owner
        ownerField: "studentId"
        operations: [create, update, delete]
      }
      { allow: private, operations: [read] }
      { allow: public, operations: [read] }
    ]
  ) {
  id: ID!
  studentId: ID!
  title: String!
  student: Student @connection(fields: ["studentId"])
  teachers: [TeachersActivations] @connection(name: "ActivationTeachers")
}

Edit: I've also added User model to see if this could be a cause too.

like image 262
hellomello Avatar asked Mar 13 '26 11:03

hellomello


1 Answers

Since both getStaticProps and getStaticPaths are called during build time, and on the server when fallback is equal to true, you need to configure Amplify for SSR (Server-Side Rendering). Make sure to take a look at SSR Support for AWS Amplify JavaScript Libraries.

The solution: first, configure Amplify for SSR:

Amplify.configure({ ...awsExports, ssr: true });

Then you need to use withSSRContext, and add the the authMode parameter. As quoted from the link above:

For example, take an AppSync GraphQL API that is backed by an identity provider such as Amazon Cognito User pools, Okto, or Auth0. Some GraphQL types may require a user to be authenticated to perform certain requests. Using the API class, the user identity will now automatically be configured and passed into the API request headers:

const SSR = withSSRContext();
const activationData = await SSR.API.graphql({
  query: listActivations,
  authMode: "AMAZON_COGNITO_USER_POOLS"
});
like image 128
Riwen Avatar answered Mar 16 '26 02:03

Riwen