Home > Enterprise >  Error: Objects are not valid as a React child (found: [object Promise]).….. While getting data from
Error: Objects are not valid as a React child (found: [object Promise]).….. While getting data from

Time:12-12

I am having a problem while getting data from supabase . Could any one help me

`

import Link from "next/link";
import { supabase } from "../../supabase"

async function Index(){

    const { data, error} = await supabase.from("Employees").select("*")

    
    return (
        <>
            <div className="container flex justify-center">
                <h1>Employees</h1>
            </div>

            
            {data.map((index) => {
                return (
                    <h1>{index.name}</h1>
                )
            })}
            

            <Link href="/employees/addemployee">
                <h1>Add employee</h1>
            </Link>
        </>
    )
}

export default Index;

`

I tried using map, other function, and looked it up yet nothing works

CodePudding user response:

The problem is how you are fetching the data. Try fetching your data inside an useEffect hook:

import Link from "next/link";
import { supabase } from "../../supabase";
import { useState, useEffect } from "react";

function Index() {
  // const { data, error } = await supabase.from("Employees").select("*")
  const [data, setData] = useState([]);
  const [error, setError] = useState(null);

  useEffect(() => {
    let cancelFetch = false; // to avoid race conditions on React18
    supabase
      .from("Employees")
      .select("*")
      .then((res) => {
        if (!cancelFetch) {
          setData(res.data);
          setError(res.error);
        }
      });
    return () => {
      cancelFetch = true;
    };
  }, []);

  return (
    <>
      <div className="container flex justify-center">
        <h1>Employees</h1>
      </div>

      {data.map((index) => {
        return <h1>{index.name}</h1>;
      })}

      <Link href="/employees/addemployee">
        <h1>Add employee</h1>
      </Link>
    </>
  );
}

export default Index;

More info on fetching and useEffect here: https://beta.reactjs.org/apis/react/useEffect#fetching-data-with-effects

CodePudding user response:

Your source code is invalid. React components should always be a function (or class) that returns a react object. it does not accept a promise that returns a react object.

You will probably want to use react's useEffect to solve this problem:

import { useState, useEffect } from "react";
import Link from "next/link";
import { supabase } from "../../supabase"

async function Index(){
    const [data, setData] = useState()
    const [error, setError] = useState()

    useEffect(() => {
      supabase.from("Employees").select("*")
        .then(data => setData(data))
        .catch(err => setError(err))
    }, [])
    
    
    return (
        <>
            <div className="container flex justify-center">
                <h1>Employees</h1>
            </div>

            
            {data.map((index) => {
                return (
                    <h1>{index.name}</h1>
                )
            })}
            

            <Link href="/employees/addemployee">
                <h1>Add employee</h1>
            </Link>
        </>
    )
}

export default Index;

CodePudding user response:

Your component cannot be async, because it returns a Promise and React doesn't like that.

There is a cool function on Next.js that allows you to fetch data asynchronously, try that:

function Index({ data }) {    
    return (
        <>
            <div className="container flex justify-center">
                <h1>Employees</h1>
            </div>

            
            {data.map((index) => {
                return (
                    <h1>{index.name}</h1>
                )
            })}
            

            <Link href="/employees/addemployee">
                <h1>Add employee</h1>
            </Link>
        </>
    )
}

export default Index;

export async function getServerSideProps() {
    const { data, error} = await supabase.from("Employees").select("*")

    return {
         props: {
                data: data
         }
    }
}

More here: https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props

CodePudding user response:

Based on the way you are fetching data, I believe you are using next13 and you are in app directory. When you rendered jsx

     {data.map((index) => {
            return (
                <h1>{index.name}</h1>
            )
        })}

index refers to each element inside the data array. Most likely index.name is an object. that is why it is throwing that error.

     console.log("index name",index.name)

If you are using async functional component, you should be using Suspense api. Create a separeate component maybe async Users, fetch the data inside this component, and when you want to display the users inside the Index

import {Suspense} from "react"

function Index(){
  return (
    <>
    ....
      <Suspense fallback={ <h1>Users are loading...</h1>} >
          <Users/>
      </Suspense>
    ....
    </>
)
}
  • Related