Search code examples
reactjsjsonecmascript-6null

how to properly display json records


Coding partly working.

I am trying to get records from Atlassian Instance via reactjs. With {codes ? JSON.stringify(codes) : 'Loading record'}

I can get the record as follows

[{"value":{"idx":"100","name":"php"},"key":"mykey"}]

Here is my issue: when I decide to map the record as per code below, I am seeing error in browser console

**TypeError: M is null
    Qd App.js:**



{codes.map(code => (
<div>
<b>{code.value.idx}</b><br/>
<b>{code.value.name}</b><br/>
</div>
    ))}
  {codes.length === 0 && <div>No Record Found</div>}

Here is the entire Code

App.js

import React, { useEffect, useState, Fragment } from "react";

function App() {
const [codes, setCodes] = useState(null);

  useEffect(() => {
invoke('mymethod').then(setCodes); 

}, []);

  return (
    <div>
      <h2> Display Codes Data</h2>

      {codes.map(code => (
<div>
<b>{code.value.idx}</b><br/>
<b>{code.value.name}</b><br/>
</div>
    ))}
  {codes.length === 0 && <div>No Record Found</div>}

{codes ? JSON.stringify(codes) : 'Loading record'}

    </div>
  );
}

export default App;

index.js

import Resolver from '@forge/resolver';
import api, { route } from "@forge/api";

const resolver = new Resolver();

resolver.define('mymethod', async (req) => { 
const res = await storage.query().where('key', startsWith('mykey')).limit(20).getMany();

console.log(res);
return res.results;

});



export const handler = resolver.getDefinitions();

Solution

  • const [codes, setCodes] = useState(null);
    

    Here, codes is initially null so on first render codes.map() and codes.length will throw errors.

    Try either initialising the state to an empty array...

    const [code, setCodes] = useState([]);
    

    OR

    Safely call .map() and .length using optional-chaining

    {codes?.map(code => (
      <div key={code.key}>
        <b>{code.value.idx}</b><br/>
        <b>{code.value.name}</b><br/>
      </div>
    ))}
    {!codes?.length && <div>No Record Found</div>}
    

    My preference is the first option as it means you don't have to worry about possible null values anywhere.