Search code examples
reactjsgraphqlnext.jsprismaprisma-graphql

Having issues with dynamic routes on Next 9


GraphQL queries in my components are not running on dynamic routes when I try to access the query string with router.query.xxx.

I have the following file

// ./pages/section/[slug].js
import { useRouter } from 'next/router';
import AppLayout from '../../components/styles/_AppLayout';

const Section = () => {
  const router = useRouter();
  return <AppLayout>Hi</AppLayout>;
};

export default Section;

The page displays fine, but as soon as I add {router.query.slug} and refresh the page, it gives me a TypeError because the GraphQL queries do not run. As you can see in the image below, me.firstName is undefined because the GraphQL query did not run

TypeError_1.jpg

This is the code in _AppLayout.js

import styled from 'styled-components';
import Navigation from '../Navigation';
const Wrapper = styled.div`...`;
const AppLayout = props => {
  return (
    <Wrapper>
      <Navigation />
      <main>{props.children}</main>
    </Wrapper>
  );
};
export default AppLayout;

Any ideas why this might be happening and how to fix it?

Thanks


Solution

  • I was able to solve my issue two ways

    Using withRouter

    import { withRouter } from 'next/router';
    import TestComponent from '../../components/TestComponent';
    import AppLayout from '../../components/styles/_AppLayout';
    const Section = props => {
      return <AppLayout>Hi {props.query.slug}</AppLayout>;
    };
    export default withRouter(Section);
    

    and passing the query parameter as props via getInitialProps

    const Section = ({slug}) => {
      return <AppLayout>Hi {slug}</AppLayout>;
    };
    Section.getInitialProps = async ({ query }) => {
      const { slug } = query;
      return { slug };
    };
    export default Section;