2

I am working on a full stack blog site project where I have created an API for back-end and its working fine and I am getting posts from it but when I try to iterate it using map it throws me error Server Error TypeError: Cannot read properties of undefined (reading 'map'), I am using NextJS for my front-end.

Code

const Blogs = ({ blogs }) => {
  return (
    <div className='all-blogs'>
      {blogs.map((blog) => (
        <div className='single-blog' key={blog._id}>
          <h1>{blog.title}</h1>
          <p>{blog.text}</p>
        </div>
      ))}
    </div>
  )
}

export async function getStaticProps() {
  const res = await fetch(
    'https://ed-blog-api.herokuapp.com/api/posts'
  )
  const blogs = await res.json()

  return {
    props: {
      blogs,
    },
  }
}

endpoint I am fetching: https://ed-blog-api.herokuapp.com/api/posts

[API fetch result on right][1]

1 Answer 1

2

The issue here is that blogs, as a prop value, is undefined until the asynchronous logic defines and populates it. You can handle this a couple ways.

  1. Provide a default prop value.

    const Blogs = ({ blogs = [] }) => {
      return (
        <div className='all-blogs'>
          {blogs.map((blog) => (
            <div className='single-blog' key={blog._id}>
              <h1>{blog.title}</h1>
              <p>{blog.text}</p>
            </div>
          ))}
        </div>
      )
    }
    
  2. Provide a fallback value to map from.

    const Blogs = ({ blogs }) => {
      return (
        <div className='all-blogs'>
          {(blogs ?? []).map((blog) => (
            <div className='single-blog' key={blog._id}>
              <h1>{blog.title}</h1>
              <p>{blog.text}</p>
            </div>
          ))}
        </div>
      )
    }
    

Note that in the event the GET requests fails (i.e. the fetch returns a rejected Promise) or any other exception is thrown while processing the request/response, then you will want to guard this by using a try/catch. Either provide valid, defined prop values to the page, or return that an error occurred or that the page content was unable to be found.

export async function getStaticProps() {
  let blogs = [];
  try {
    const res = await fetch('https://ed-blog-api.herokuapp.com/api/posts');
    blogs = await res.json();
  } catch(error) {
    // handle error, logging, etc...
    // maybe optionally returning `notFound: true` as a 404
  }
  return {
    props: {
      blogs,
    },
  }
}
Sign up to request clarification or add additional context in comments.

4 Comments

But the fetch is inside getStaticProps, props always should be defined unless the fetch thows an error, your argument right only if fetch is declared inside function component.
@ChemiAdel I didn't say props was undefined, that's not really possible in React. I said the blogs prop value is undefined. In other words, a value hasn't been assigned to it yet.
@ChemiAdel has a point. blogs will only be undefined inside Blog if the request fails inside getStaticProps (note that the error is happening on the server when Next.js is pre-rendering the page). A better solution here is to handle the API call properly in getStaticProps.
@juliomalves I don't disagree with your comment, added a bit of clarification.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.