{"id":52048,"date":"2024-01-12T00:00:00","date_gmt":"2024-01-12T08:00:00","guid":{"rendered":"https:\/\/www.griddb.net\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/"},"modified":"2026-03-30T12:19:12","modified_gmt":"2026-03-30T19:19:12","slug":"creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb","status":"publish","type":"post","link":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/","title":{"rendered":"Creating A Daily Meal Plan App Using ReactJS, NodeJS, ExpressJS, and GridDB"},"content":{"rendered":"<p>Creating a daily meal plan app is like designing a roadmap for your body. It ensures you get to eat a balanced diet that will fuel your body and make you live a healthy life.<\/p>\n<p>With a well-thought-out daily meal plan, you can meet your nutritional needs while improving your energy levels and overall health.<\/p>\n<p>So, here\u2019s a detailed breakdown of the process required to create a daily meal plan application using technologies like ReactJS, NodeJS, ExpressJS, and GridDB.<\/p>\n<h2>Introduction<\/h2>\n<p>According to <a href=\"https:\/\/www.who.int\/news\/item\/04-03-2022-world-obesity-day-2022-accelerating-action-to-stop-obesity\">WHO (World Health Organization)<\/a>, 1 billion people worldwide are obese and an additional 167 million people will be added to that number by 2025. This explains the importance of dieting and why everyone should eat healthily with a daily meal plan.<\/p>\n<p>Dieting is neither easy nor fun, but accountability in any form would enable anyone to achieve their dieting goals. This daily meal plan web application was made to help users build meal plans that would ensure they maintain a healthy diet.<\/p>\n<p><a href=\"https:\/\/griddb.net\/en\/\">GridDB<\/a> is the database that will be used to store meal plans.<\/p>\n<p>In this article, we will use what is called the GERN stack (GridDB, ExpressJS, ReactJS, and NodeJS) to build a Fullstack meal planning web application.<\/p>\n<h2>The Application<\/h2>\n<p>While I installed <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/wsl\/\">WSL<\/a> (Windows Subsystem for Linux) on my Windows to have access to Linux (Ubuntu) on my machine, you could also follow along with this tutorial using Docker. The <a href=\"https:\/\/docs.griddb.net\/installation\/misc.html\">GridDB documentation<\/a> provides you with a detailed installation process to successfully install the database on your computer. There are also top-notch YouTube videos on their <a href=\"https:\/\/www.youtube.com\/@GridDB\">YouTube channel<\/a> for those who prefer videos to written documentation. The entire code for the web application is available on <a href=\"https:\/\/github.com\/Babajide777\/grid-db-meal-planner\">Github<\/a>.<\/p>\n<p>Open your terminal and clone the repo using this command<\/p>\n<div class=\"clipboard\">\n<pre><code>git clone https:\/\/github.com\/griddbnet\/Blogs.git --branch meal-planner<\/code><\/pre>\n<\/div>\n<h2>The App Classification<\/h2>\n<p>This application is divided into 2 parts \u2013<\/p>\n<ol>\n<li>The Backend<\/li>\n<li>The Frontend<\/li>\n<\/ol>\n<h2>Prerequisites<\/h2>\n<ul>\n<li>GridDB version 5.3.0<\/li>\n<li>Node v12.22.9<\/li>\n<\/ul>\n<h2>The Backend<\/h2>\n<p>The backend in this project ensures the correct meal data is gotten from the frontend, and then saved to the GridDB database. We are able to perform functionalities with the GridDB database.<\/p>\n<p>The proper CRUD functionalities are carried out in the app.<\/p>\n<p>These are the packages that are needed to build the backend.<\/p>\n<ul>\n<li><a href=\"https:\/\/expressjs.com\/\">ExpressJs<\/a>: A minimalist NodeJS framework that is used for building RESTful APIs.<\/p>\n<\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/morgan\">Morgan<\/a>: A NodeJS middleware that is used to log HTTP requests.<\/p>\n<\/li>\n<li><a href=\"https:\/\/github.com\/griddb\/node-api\">GridDB Node API<\/a>: The GridDB client for NodeJS<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/joi.dev\/api\/18.x.x\">Joi<\/a>: A schema description language and data validator for JavaScript<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.npmjs.com\/package\/uuid\">UUID<\/a>: This package will be used to create a random ID.<\/p>\n<\/li>\n<\/ul>\n<h2>Step-by-Step Guide to Building the Meal Plan App<\/h2>\n<p>Follow the steps as explained below;<\/p>\n<h2>Step 1: Create a Server Folder<\/h2>\n<p>Create a \u201cserver\u201d folder and initialize npm to generate a package.json file. You can name the folder anything you want:<\/p>\n<div class=\"clipboard\">\n<pre><code>npm i<\/code><\/pre>\n<\/div>\n<h2>Step 2: Install Required Packages<\/h2>\n<p>We are going to install all the required packages at once by running the following line of code:<\/p>\n<div class=\"clipboard\">\n<pre><code>npm i express morgan joi uuid  griddb-node-api cors<\/code><\/pre>\n<\/div>\n<p><strong><em>Addition<\/em><\/strong><\/p>\n<p>While it is not required to install nodemon, it&#8217;s nice to have in development so that the server would restart automatically when any change is saved. This is the command to install nodemon as a dev dependency:<\/p>\n<div class=\"clipboard\">\n<pre><code>npm i -D nodemon<\/code><\/pre>\n<\/div>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">{\n  \"name\": \"meal-planner-server\",\n  \"version\": \"1.0.0\",\n  \"description\": \"backend for meal planner\",\n  \"main\": \"server.js\",\n  \"scripts\": {\n    \"test\": \"echo \"Error: no test specified\" && exit 1\",\n    \"dev\": \"nodemon server.js\"\n  },\n  \"keywords\": [\n    \"meal-planner\",\n    \"meal\",\n    \"planner\",\n    \"griddb\",\n    \"griddb_node\"\n  ],\n  \"author\": \"Oyafemi Babajide\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"cors\": \"^2.8.5\",\n    \"express\": \"^4.18.2\",\n    \"griddb_node\": \"^0.8.4\",\n    \"griddb-node-api\": \"^0.8.6\",\n    \"joi\": \"^17.11.0\",\n    \"morgan\": \"^1.10.0\",\n    \"uuid\": \"^9.0.1\"\n  },\n  \"devDependencies\": {\n    \"nodemon\": \"^3.0.1\"\n  }\n}<\/code><\/pre>\n<\/div>\n<h3>Step 3: Create Server.js File<\/h3>\n<p>Create a server.js file and insert the following code:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">const express = require(\"express\");\nconst morgan = require(\"morgan\");\nconst app = express();\nconst cors = require(\"cors\")\n\nconst PORT = 4000 || process.env.PORT;\n\napp.use(morgan(\"dev\"));\napp.use(express.json());\napp.use(express.urlencoded({ extended: false }));\napp.use(cors(\"*\"))\napp.use(\"\/api\", require(\".\/routes\/mealRoutes\"));\n\napp.listen(PORT, () => {\n  console.log(`Server started on ${PORT}`);\n});<\/code><\/pre>\n<\/div>\n<p>If you installed nodemon as a dev dependency, you\u2019ll need to add this line of code to the \u201cscripts\u201d section in your package.json file:<\/p>\n<div class=\"clipboard\">\n<pre><code>\"dev\": \"nodemon index.js\"<\/code><\/pre>\n<\/div>\n<h3>Step 4: Run the Application<\/h3>\n<p>If you installed nodemon, you could use \u2018npm start\u2019 to start the application, however, this would require you to restart the application any time you make changes, going against what nodemon is intended for. The following method doesn\u2019t require you to restart the application when you make any changes (the benefit of nodemon):<\/p>\n<div class=\"clipboard\">\n<pre><code>npm run dev<\/code><\/pre>\n<\/div>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/1.jpg\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/1.jpg\" alt=\"\" width=\"692\" height=\"229\" class=\"aligncenter size-full wp-image-29897\" srcset=\"\/wp-content\/uploads\/2024\/01\/1.jpg 692w, \/wp-content\/uploads\/2024\/01\/1-300x99.jpg 300w, \/wp-content\/uploads\/2024\/01\/1-600x199.jpg 600w\" sizes=\"(max-width: 692px) 100vw, 692px\" \/><\/a><\/p>\n<h3>Step 5: Setup the GridDB Database<\/h3>\n<p>We will connect to the GridDB database using the griddb-node-api package. We then set the container name of the project. I chose <em>&#8220;meal-planner&#8221;<\/em> because it is related to the project. However, you can call it whatever you want.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-javascript\">const griddb = require(\"griddb-node-api\");\n\nconst containerName = \"meal-planner\";\n\nconst initStore = async () => {\n  const factory = griddb.StoreFactory.getInstance();\n  try {\n    \/\/ Connect to GridDB Cluster\n    const store = await factory.getStore({\n      host: \"127.0.0.1\",\n      port: 10001,\n      clusterName: \"myCluster\",\n      username: \"admin\",\n      password: \"admin\",\n    });\n    return store;\n  } catch (e) {\n    throw e;\n  }\n};\n\nfunction initContainer() {\n  const conInfo = new griddb.ContainerInfo({\n    name: containerName,\n    columnInfoList: [\n      [\"id\", griddb.Type.STRING],\n      [\"title\", griddb.Type.STRING],\n      [\"calories\", griddb.Type.DOUBLE],\n      [\"fat\", griddb.Type.DOUBLE],\n      [\"cabs\", griddb.Type.DOUBLE],\n      [\"protein\", griddb.Type.DOUBLE],\n      [\"days\", griddb.Type.STRING],\n      [\"breakfast\", griddb.Type.STRING],\n      [\"lunch\", griddb.Type.STRING],\n      [\"dinner\", griddb.Type.STRING],\n      [\"snack1\", griddb.Type.STRING],\n      [\"snack2\", griddb.Type.STRING],\n      [\"snack3\", griddb.Type.STRING],\n    ],\n    type: griddb.ContainerType.COLLECTION,\n    rowKey: true,\n  });\n\n  return conInfo;\n}\n\nasync function createContainer(store, conInfo) {\n  try {\n    const collectionDB = await store.putContainer(conInfo);\n    return collectionDB;\n  } catch (err) {\n    console.error(err);\n    throw err;\n  }\n}\n\nasync function initGridDbTS() {\n  try {\n    const store = await initStore();\n    const conInfo = await initContainer();\n    const collectionDb = await createContainer(store, conInfo);\n    return { collectionDb, store, conInfo };\n  } catch (err) {\n    console.error(err);\n    throw err;\n  }\n}<\/code><\/pre>\n<\/div>\n<p>The initStore function connects the app to the GridDB Cluster using the host, port, clusterName, username, and password. The initContainer function is used to set the columns for the container and the datatypes for the different columns. The createContainer creates the container while initGridDbTS initializes the database connection.<\/p>\n<h3>Step 6: Create a Meal plan<\/h3>\n<p>To create a meal plan;<\/p>\n<div class=\"clipboard\">\n<pre><code>router.post(\"\/add-meal\", addMealPlan);<\/code><\/pre>\n<\/div>\n<p>We use the Joi package to validate the request body sent from the frontend and then insert into the container that is created in step 6.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-javascript\">\/\/meal plan validation rules\nconst mealPlanValidation = async (field) => {\n  const schema = Joi.object({\n    title: Joi.string().required(),\n    calories: Joi.number().integer().required(),\n    fat: Joi.number().integer().required(),\n    cabs: Joi.number().integer().required(),\n    protein: Joi.number().integer().required(),\n    days: Joi.array()\n      .items(\n        Joi.string().valid(\n          \"sunday\",\n          \"monday\",\n          \"tuesday\",\n          \"wednesday\",\n          \"thursday\",\n          \"friday\",\n          \"saturday\"\n        )\n      )\n      .max(7)\n      .min(1)\n      .required(),\n    breakfast: Joi.string().required(),\n    lunch: Joi.string().required(),\n    dinner: Joi.string().required(),\n    snack1: Joi.string().required(),\n    snack2: Joi.string().required(),\n    snack3: Joi.string().required(),\n  });\n  try {\n    return await schema.validateAsync(field, { abortEarly: false });\n  } catch (err) {\n    return err;\n  }\n};\n\n\n\n\nasync function insert(data, container) {\n  try {\n    await container.put(data);\n    return { status: true };\n  } catch (err) {\n    if (err.constructor.name == \"GSException\") {\n      for (var i = 0; i &lt; err.getErrorStackSize(); i++) {\n        console.log(\"[%d]\", i);\n        console.log(err.getErrorCode(i));\n        console.log(err.getMessage(i));\n      }\n\n      return { status: false, error: err.toString() };\n    } else {\n      console.log(err);\n      return { status: false, error: err };\n    }\n  }\n}<\/code><\/pre>\n<\/div>\n<p>Before that, the uuid package is used to generate a random id. After the meal plan is saved to the database, we then query the meal plan using the created random id to get the details of the saved meal plan.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-javascript\">async function queryByID(id, conInfo, store) {\n  try {\n    const cont = await store.putContainer(conInfo);\n    const row = await cont.get(id);\n    return row;\n  } catch (err) {\n    console.log(err, \"here\");\n  }\n}\n\nconst addMealPlan = async (req, res) => {\n  \/\/validate req.body\n\n  const { collectionDb, store, conInfo } = await initGridDbTS();\n\n  const { details } = await mealPlanValidation(req.body);\n  if (details) {\n    let allErrors = details.map((detail) => detail.message.replace(\/\"\/g, \"\"));\n    return responseHandler(res, allErrors, 400, false, \"\");\n  }\n\n  try {\n    const {\n      title,\n      calories,\n      fat,\n      cabs,\n      protein,\n      days,\n      breakfast,\n      lunch,\n      dinner,\n      snack1,\n      snack2,\n      snack3,\n    } = req.body;\n\n    const id = uuidv4();\n\n    const data = [\n      id,\n      title,\n      calories,\n      fat,\n      cabs,\n      protein,\n      days.join(\";\"),\n      breakfast,\n      lunch,\n      dinner,\n      snack1,\n      snack2,\n      snack3,\n    ];\n\n    const saveStatus = await insert(data, collectionDb);\n\n    if (saveStatus.status) {\n      const result = await queryByID(id, conInfo, store);\n      return responseHandler(\n        res,\n        \"Meal plan saved successfully\",\n        201,\n        true,\n        result\n      );\n    }\n\n    return responseHandler(\n      res,\n      \"Unable to save meal plan\",\n      400,\n      false,\n      saveStatus.error\n    );\n  } catch (error) {\n    responseHandler(res, \"Error saving meal plan\", 400, false, error);\n  }\n};<\/code><\/pre>\n<\/div>\n<p>The meal plan details are then sent to the frontend as a json response.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/2.jpg\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/2.jpg\" alt=\"\" width=\"820\" height=\"222\" class=\"aligncenter size-full wp-image-29898\" srcset=\"\/wp-content\/uploads\/2024\/01\/2.jpg 820w, \/wp-content\/uploads\/2024\/01\/2-300x81.jpg 300w, \/wp-content\/uploads\/2024\/01\/2-768x208.jpg 768w, \/wp-content\/uploads\/2024\/01\/2-600x162.jpg 600w\" sizes=\"(max-width: 820px) 100vw, 820px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/3.jpg\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/3.jpg\" alt=\"\" width=\"903\" height=\"432\" class=\"aligncenter size-full wp-image-29899\" srcset=\"\/wp-content\/uploads\/2024\/01\/3.jpg 903w, \/wp-content\/uploads\/2024\/01\/3-300x144.jpg 300w, \/wp-content\/uploads\/2024\/01\/3-768x367.jpg 768w, \/wp-content\/uploads\/2024\/01\/3-600x287.jpg 600w\" sizes=\"(max-width: 903px) 100vw, 903px\" \/><\/a><\/p>\n<h3>Step 7: Get a Meal Plan Details<\/h3>\n<p>The id of the meal plan that is required is gotten from the params of the request data.<\/p>\n<div class=\"clipboard\">\n<pre><code>router.get(\"\/meal-detail\/:id\", mealPlanDetails);<\/code><\/pre>\n<\/div>\n<p>Then id of the meal plan is then queried with the data in the database and a 200 response with the meal plan data is sent if the meal plan is found.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-javascript\">const mealPlanDetails = async (req, res) => {\n  const { store, conInfo } = await initGridDbTS();\n  const { id } = req.params;\n\n  const result = await queryByID(id, conInfo, store);\n\n  return result\n    ? responseHandler(res, \"meal plan detail found\", 200, true, result)\n    : responseHandler(res, \"No meal plan found\", 400, false, \"\");\n};<\/code><\/pre>\n<\/div>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/4.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/4.jpg\" alt=\"\" width=\"636\" height=\"185\" class=\"aligncenter size-full wp-image-29900\" srcset=\"\/wp-content\/uploads\/2024\/01\/4.jpg 636w, \/wp-content\/uploads\/2024\/01\/4-300x87.jpg 300w, \/wp-content\/uploads\/2024\/01\/4-600x175.jpg 600w\" sizes=\"(max-width: 636px) 100vw, 636px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/5.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/5.jpg\" alt=\"\" width=\"917\" height=\"480\" class=\"aligncenter size-full wp-image-29901\" srcset=\"\/wp-content\/uploads\/2024\/01\/5.jpg 917w, \/wp-content\/uploads\/2024\/01\/5-300x157.jpg 300w, \/wp-content\/uploads\/2024\/01\/5-768x402.jpg 768w, \/wp-content\/uploads\/2024\/01\/5-600x314.jpg 600w\" sizes=\"(max-width: 917px) 100vw, 917px\" \/><\/a><\/p>\n<h3>Step 8: Edit a Meal Plan<\/h3>\n<div class=\"clipboard\">\n<pre><code>router.put(\"\/edit-meal\/:id\", editMealPlan);<\/code><\/pre>\n<\/div>\n<p>To edit a meal plan, again the id of the required meal plan is sent in the params of the request. The meal plan is queried using the given id and the old details of the meal plan is replaced by the new ones.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-javascript\">const editMealPlan = async (req, res) => {\n  const { store, conInfo } = await initGridDbTS();\n  const { id } = req.params;\n\n  const result = await queryByID(id, conInfo, store);\n\n  if (!result) {\n    return responseHandler(res, \"incorrect meal plan ID\", 400, false, \"\");\n  }\n\n  const {\n    title,\n    calories,\n    fat,\n    cabs,\n    protein,\n    days,\n    breakfast,\n    lunch,\n    dinner,\n    snack1,\n    snack2,\n    snack3,\n  } = req.body;\n\n  const data = [\n    id,\n    title,\n    calories,\n    fat,\n    cabs,\n    protein,\n    days.join(\";\"),\n    breakfast,\n    lunch,\n    dinner,\n    snack1,\n    snack2,\n    snack3,\n  ];\n\n  const check = await editByID(store, conInfo, data);\n\n  if (check[0]) {\n    const result2 = await queryByID(id, conInfo, store);\n\n    return responseHandler(\n      res,\n      \"meal plan edited successfully\",\n      200,\n      true,\n      result2\n    );\n  }\n  return responseHandler(res, \"Error editing meal plan\", 400, false, \"\");\n};\n\nconst editByID = async (store, conInfo, data) => {\n  try {\n    const cont = await store.putContainer(conInfo);\n    const res = await cont.put(data);\n    return [true, \"\"];\n  } catch (err) {\n    return [false, err];\n  }\n};\n<\/code><\/pre>\n<\/div>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/6.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/6.jpg\" alt=\"\" width=\"936\" height=\"468\" class=\"aligncenter size-full wp-image-29902\" srcset=\"\/wp-content\/uploads\/2024\/01\/6.jpg 936w, \/wp-content\/uploads\/2024\/01\/6-300x150.jpg 300w, \/wp-content\/uploads\/2024\/01\/6-768x384.jpg 768w, \/wp-content\/uploads\/2024\/01\/6-600x300.jpg 600w\" sizes=\"(max-width: 936px) 100vw, 936px\" \/><\/a><\/p>\n<h3>Step 9: Delete a Meal Plan<\/h3>\n<div class=\"clipboard\">\n<pre><code>router.delete(\"\/delete-meal\/:id\", deleteMealPlan);<\/code><\/pre>\n<\/div>\n<p>The id is gotten from the params or the request data and that is used to delete the row containing the required meal plan.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-javascript\">const deleteMealPlan = async (req, res) => {\n  const { store, conInfo } = await initGridDbTS();\n  const { id } = req.params;\n\n  const result = await deleteByID(store, id, conInfo);\n\n  return result[0]\n    ? responseHandler(res, \"meal plan deleted successfully\", 200, true, \"\")\n    : responseHandler(res, \"Error deleting meal plan\", 400, false, \"\");\n};\n\n\n\/\/Delete entry\nconst deleteByID = async (store, id, conInfo) => {\n  try {\n    const cont = await store.putContainer(conInfo);\n    let res = await cont.remove(id);\n\n    return [true, res];\n  } catch (error) {\n    return [false, error];\n  }\n};<\/code><\/pre>\n<\/div>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/7.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/7.jpg\" alt=\"\" width=\"963\" height=\"260\" class=\"aligncenter size-full wp-image-29903\" srcset=\"\/wp-content\/uploads\/2024\/01\/7.jpg 963w, \/wp-content\/uploads\/2024\/01\/7-300x81.jpg 300w, \/wp-content\/uploads\/2024\/01\/7-768x207.jpg 768w, \/wp-content\/uploads\/2024\/01\/7-600x162.jpg 600w\" sizes=\"(max-width: 963px) 100vw, 963px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/8.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/8.jpg\" alt=\"\" width=\"941\" height=\"211\" class=\"aligncenter size-full wp-image-29904\" srcset=\"\/wp-content\/uploads\/2024\/01\/8.jpg 941w, \/wp-content\/uploads\/2024\/01\/8-300x67.jpg 300w, \/wp-content\/uploads\/2024\/01\/8-768x172.jpg 768w, \/wp-content\/uploads\/2024\/01\/8-600x135.jpg 600w\" sizes=\"(max-width: 941px) 100vw, 941px\" \/><\/a><\/p>\n<h3>Step 10: Get List of All Meal Plans in the Database<\/h3>\n<p>To get list of all meal plans in the database, you have to do this;<\/p>\n<div class=\"clipboard\">\n<pre><code>router.get(\"\/all-meals\", getAllMealPlans);<\/code><\/pre>\n<\/div>\n<p>This returns all the meal plans in the database.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-javascript\">const getAllMealPlans = async (req, res) => {\n  const { store, conInfo } = await initGridDbTS();\n  const result = await queryAll(conInfo, store);\n\n  return result.length\n    ? responseHandler(\n        res,\n        \"all meal plans in the database successfully retrieved\",\n        200,\n        true,\n        result.results\n      )\n    : responseHandler(res, \"Unable to retrieve meal plans\", 400, false, \"\");\n};\n\nasync function queryAll(conInfo, store) {\n  const sql = `SELECT *`;\n  const cont = await store.putContainer(conInfo);\n  const query = await cont.query(sql);\n  try {\n    const rowset = await query.fetch();\n    const results = [];\n\n    while (rowset.hasNext()) {\n      const row = rowset.next();\n      results.push(row);\n    }\n    return { results, length: results.length };\n  } catch (err) {\n    console.log(err);\n    return err;\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/9.png\" alt=\"\" width=\"732\" height=\"243\" class=\"aligncenter size-full wp-image-29905\" srcset=\"\/wp-content\/uploads\/2024\/01\/9.png 732w, \/wp-content\/uploads\/2024\/01\/9-300x100.png 300w, \/wp-content\/uploads\/2024\/01\/9-600x199.png 600w\" sizes=\"(max-width: 732px) 100vw, 732px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/10.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/10.jpg\" alt=\"\" width=\"937\" height=\"473\" class=\"aligncenter size-full wp-image-29906\" srcset=\"\/wp-content\/uploads\/2024\/01\/10.jpg 937w, \/wp-content\/uploads\/2024\/01\/10-300x151.jpg 300w, \/wp-content\/uploads\/2024\/01\/10-768x388.jpg 768w, \/wp-content\/uploads\/2024\/01\/10-600x303.jpg 600w\" sizes=\"(max-width: 937px) 100vw, 937px\" \/><\/a><\/p>\n<h2>The Frontend<\/h2>\n<p>The beauty of this meal plan app is that the UI allows users to add, view, edit, and delete a meal plan. The following libraries were used to build the UI for this project:<\/p>\n<h3><a href=\"https:\/\/react.dev\/\">ReactJs<\/a>:<\/h3>\n<p>ReactJS is a JavaScript library built and maintained by Meta for building user interfaces.<\/p>\n<h3><a href=\"https:\/\/mui.com\/\">Material UI<\/a>:<\/h3>\n<p>Material UI is a comprehensive library of components from Google&#8217;s Material Design system.<\/p>\n<h3><a href=\"https:\/\/redux-toolkit.js.org\/\">Redux Toolkit<\/a>:<\/h3>\n<p>Redux Toolkit is a state management library.<\/p>\n<p>To view the frontend of the app change to the client directory.<\/p>\n<div class=\"clipboard\">\n<pre><code>cd client<\/code><\/pre>\n<\/div>\n<p>Now install the required dependencies<\/p>\n<div class=\"clipboard\">\n<pre><code>npm i<\/code><\/pre>\n<\/div>\n<p>Then run the app using<\/p>\n<div class=\"clipboard\">\n<pre><code>npm start<\/code><\/pre>\n<\/div>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-12-at-1.54.40\u202fPM.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-12-at-1.54.40\u202fPM.png\" alt=\"\" width=\"1855\" height=\"820\" class=\"aligncenter size-full wp-image-29907\" srcset=\"\/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-12-at-1.54.40\u202fPM.png 1855w, \/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-12-at-1.54.40\u202fPM-300x133.png 300w, \/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-12-at-1.54.40\u202fPM-1024x453.png 1024w, \/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-12-at-1.54.40\u202fPM-768x339.png 768w, \/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-12-at-1.54.40\u202fPM-1536x679.png 1536w, \/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-12-at-1.54.40\u202fPM-600x265.png 600w\" sizes=\"(max-width: 1855px) 100vw, 1855px\" \/><\/a><\/p>\n<p>The meal plan list page would show up.<\/p>\n<p>For those who want to build the UI from scratch, the link to the <a href=\"https:\/\/www.figma.com\/file\/TZKMNuFYmIrhJX9k8xYpTL\/Untitled?type=design&amp;node-id=293%3A1074&amp;mode=design&amp;t=cWSzt3F22jHWmrwj-1\">Figma<\/a> design file has been provided.<\/p>\n<h2>Conclusion<\/h2>\n<p>The daily meal plan app created has a dynamic and user-friendly interface. What makes it special is the easy integration of the GridDB database to store, edit, and retrieve meal-related data. This ensures you can set up API calls easily fetch meal plan data from the database. Whether you\u2019re aiming to meet your fitness goals or just want to treat your taste buds, this daily meal plan app is all you need.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Creating a daily meal plan app is like designing a roadmap for your body. It ensures you get to eat a balanced diet that will fuel your body and make you live a healthy life. With a well-thought-out daily meal plan, you can meet your nutritional needs while improving your energy levels and overall health. [&hellip;]<\/p>\n","protected":false},"author":41,"featured_media":52049,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[121],"tags":[],"class_list":["post-52048","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Creating A Daily Meal Plan App Using ReactJS, NodeJS, ExpressJS, and GridDB | GridDB: Open Source Time Series Database for IoT<\/title>\n<meta name=\"description\" content=\"Creating a daily meal plan app is like designing a roadmap for your body. It ensures you get to eat a balanced diet that will fuel your body and make you\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Creating A Daily Meal Plan App Using ReactJS, NodeJS, ExpressJS, and GridDB | GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"og:description\" content=\"Creating a daily meal plan app is like designing a roadmap for your body. It ensures you get to eat a balanced diet that will fuel your body and make you\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/\" \/>\n<meta property=\"og:site_name\" content=\"GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/griddbcommunity\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-12T08:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-30T19:19:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.griddb.net\/wp-content\/uploads\/2025\/12\/close-up_1280x960.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"960\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"griddb-admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:site\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"griddb-admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/\"},\"author\":{\"name\":\"griddb-admin\",\"@id\":\"https:\/\/www.griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\"},\"headline\":\"Creating A Daily Meal Plan App Using ReactJS, NodeJS, ExpressJS, and GridDB\",\"datePublished\":\"2024-01-12T08:00:00+00:00\",\"dateModified\":\"2026-03-30T19:19:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/\"},\"wordCount\":1173,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.griddb.net\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2025\/12\/close-up_1280x960.jpeg\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/\",\"url\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/\",\"name\":\"Creating A Daily Meal Plan App Using ReactJS, NodeJS, ExpressJS, and GridDB | GridDB: Open Source Time Series Database for IoT\",\"isPartOf\":{\"@id\":\"https:\/\/www.griddb.net\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2025\/12\/close-up_1280x960.jpeg\",\"datePublished\":\"2024-01-12T08:00:00+00:00\",\"dateModified\":\"2026-03-30T19:19:12+00:00\",\"description\":\"Creating a daily meal plan app is like designing a roadmap for your body. It ensures you get to eat a balanced diet that will fuel your body and make you\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#primaryimage\",\"url\":\"\/wp-content\/uploads\/2025\/12\/close-up_1280x960.jpeg\",\"contentUrl\":\"\/wp-content\/uploads\/2025\/12\/close-up_1280x960.jpeg\",\"width\":1280,\"height\":960},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.griddb.net\/en\/#website\",\"url\":\"https:\/\/www.griddb.net\/en\/\",\"name\":\"GridDB: Open Source Time Series Database for IoT\",\"description\":\"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL\",\"publisher\":{\"@id\":\"https:\/\/www.griddb.net\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.griddb.net\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.griddb.net\/en\/#organization\",\"name\":\"Fixstars\",\"url\":\"https:\/\/www.griddb.net\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.griddb.net\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"contentUrl\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"width\":200,\"height\":83,\"caption\":\"Fixstars\"},\"image\":{\"@id\":\"https:\/\/www.griddb.net\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/griddbcommunity\/\",\"https:\/\/x.com\/GridDBCommunity\",\"https:\/\/www.linkedin.com\/company\/griddb-by-toshiba\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\",\"name\":\"griddb-admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.griddb.net\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"caption\":\"griddb-admin\"},\"url\":\"https:\/\/www.griddb.net\/en\/author\/griddb-admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Creating A Daily Meal Plan App Using ReactJS, NodeJS, ExpressJS, and GridDB | GridDB: Open Source Time Series Database for IoT","description":"Creating a daily meal plan app is like designing a roadmap for your body. It ensures you get to eat a balanced diet that will fuel your body and make you","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/","og_locale":"en_US","og_type":"article","og_title":"Creating A Daily Meal Plan App Using ReactJS, NodeJS, ExpressJS, and GridDB | GridDB: Open Source Time Series Database for IoT","og_description":"Creating a daily meal plan app is like designing a roadmap for your body. It ensures you get to eat a balanced diet that will fuel your body and make you","og_url":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/","og_site_name":"GridDB: Open Source Time Series Database for IoT","article_publisher":"https:\/\/www.facebook.com\/griddbcommunity\/","article_published_time":"2024-01-12T08:00:00+00:00","article_modified_time":"2026-03-30T19:19:12+00:00","og_image":[{"width":1280,"height":960,"url":"https:\/\/www.griddb.net\/wp-content\/uploads\/2025\/12\/close-up_1280x960.jpeg","type":"image\/jpeg"}],"author":"griddb-admin","twitter_card":"summary_large_image","twitter_creator":"@GridDBCommunity","twitter_site":"@GridDBCommunity","twitter_misc":{"Written by":"griddb-admin","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#article","isPartOf":{"@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/"},"author":{"name":"griddb-admin","@id":"https:\/\/www.griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233"},"headline":"Creating A Daily Meal Plan App Using ReactJS, NodeJS, ExpressJS, and GridDB","datePublished":"2024-01-12T08:00:00+00:00","dateModified":"2026-03-30T19:19:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/"},"wordCount":1173,"commentCount":0,"publisher":{"@id":"https:\/\/www.griddb.net\/en\/#organization"},"image":{"@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2025\/12\/close-up_1280x960.jpeg","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/","url":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/","name":"Creating A Daily Meal Plan App Using ReactJS, NodeJS, ExpressJS, and GridDB | GridDB: Open Source Time Series Database for IoT","isPartOf":{"@id":"https:\/\/www.griddb.net\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#primaryimage"},"image":{"@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2025\/12\/close-up_1280x960.jpeg","datePublished":"2024-01-12T08:00:00+00:00","dateModified":"2026-03-30T19:19:12+00:00","description":"Creating a daily meal plan app is like designing a roadmap for your body. It ensures you get to eat a balanced diet that will fuel your body and make you","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-daily-meal-plan-app-using-reactjs-nodejs-expressjs-and-griddb\/#primaryimage","url":"\/wp-content\/uploads\/2025\/12\/close-up_1280x960.jpeg","contentUrl":"\/wp-content\/uploads\/2025\/12\/close-up_1280x960.jpeg","width":1280,"height":960},{"@type":"WebSite","@id":"https:\/\/www.griddb.net\/en\/#website","url":"https:\/\/www.griddb.net\/en\/","name":"GridDB: Open Source Time Series Database for IoT","description":"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL","publisher":{"@id":"https:\/\/www.griddb.net\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.griddb.net\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.griddb.net\/en\/#organization","name":"Fixstars","url":"https:\/\/www.griddb.net\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.griddb.net\/en\/#\/schema\/logo\/image\/","url":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","contentUrl":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","width":200,"height":83,"caption":"Fixstars"},"image":{"@id":"https:\/\/www.griddb.net\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/griddbcommunity\/","https:\/\/x.com\/GridDBCommunity","https:\/\/www.linkedin.com\/company\/griddb-by-toshiba"]},{"@type":"Person","@id":"https:\/\/www.griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233","name":"griddb-admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.griddb.net\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","caption":"griddb-admin"},"url":"https:\/\/www.griddb.net\/en\/author\/griddb-admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/52048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/comments?post=52048"}],"version-history":[{"count":2,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/52048\/revisions"}],"predecessor-version":[{"id":55119,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/52048\/revisions\/55119"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/media\/52049"}],"wp:attachment":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/media?parent=52048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/categories?post=52048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/tags?post=52048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}