{"id":7421,"date":"2026-08-06T22:08:06","date_gmt":"2026-08-06T13:08:06","guid":{"rendered":"https:\/\/www.freelifemakers.org\/wordpress\/?p=7421"},"modified":"2026-08-07T12:50:14","modified_gmt":"2026-08-07T03:50:14","slug":"nextjs-guestbook-sqlite-nextauth","status":"publish","type":"post","link":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/06\/nextjs-guestbook-sqlite-nextauth\/","title":{"rendered":"[nextjs]\ubc29\uba85\ub85d + sqlite+nextauth \/ guestbook + sqlite + nextauth"},"content":{"rendered":"\n<p>\ud83d\udc49\ud83c\udffb \uae30\uc874 \ud504\ub85c\uc81d\ud2b8\uc778 \ubc29\uba85\ub85d + sqlite\uc5d0 \uae43\ud5c8\ube0c \uc18c\uc15c\ub85c\uadf8\uc778(\uae43\ud5c8\ube0c) \uae30\ub2a5\uc744 \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4.<br>I added a GitHub social login feature to the existing guestbook project (which uses SQLite).<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb\uc18c\uc15c\ub85c\uadf8\uc778 \uae30\ub2a5\uacfc SQLite\uc5d0 \uae00 \uc785\ub825\ud558\ub294 \ubd80\ubd84\uc740 \uc774\uc804 \ud3ec\uc2a4\ud2b8\ub97c \ucc38\uc870\ud558\uc138\uc694<br>Please refer to the previous post for the social login feature and the section on saving posts to SQLite.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uc774\uc804 \ud3ec\uc2a4\ud2b8 \/ Previous post<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-freelifemakers-org wp-block-embed-freelifemakers-org\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"jvQdXPSKcm\"><a href=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/06\/nextjs-guestbook-sqlite\/\">[nextjs]\ubc29\uba85\ub85d + SQLite \/ Guestbook + SQLite<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;[nextjs]\ubc29\uba85\ub85d + SQLite \/ Guestbook + SQLite&#8221; &#8212; freelifemakers.org\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/06\/nextjs-guestbook-sqlite\/embed\/#?secret=w1WFYaZ3eu#?secret=jvQdXPSKcm\" data-secret=\"jvQdXPSKcm\" width=\"560\" height=\"315\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-freelifemakers-org wp-block-embed-freelifemakers-org\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"JmMmL3Gc7I\"><a href=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/05\/nextjs-social-login\/\">[nextjs]\uc18c\uc15c\ub85c\uadf8\uc778 \/ Social Login (github)<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;[nextjs]\uc18c\uc15c\ub85c\uadf8\uc778 \/ Social Login (github)&#8221; &#8212; freelifemakers.org\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/05\/nextjs-social-login\/embed\/#?secret=0mCYnkCpQP#?secret=JmMmL3Gc7I\" data-secret=\"JmMmL3Gc7I\" width=\"560\" height=\"315\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>\ud83d\udcc1 \uc804\uccb4 \ud504\ub85c\uc81d\ud2b8 \uad6c\uc870 \/ Overall Project Structure<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>myapp7\/ \n\u251c\u2500\u2500 app\/ (Next.js App Router)\n\u2502   \u251c\u2500\u2500 api\/ (Backend API)\n\u2502   \u2502   \u251c\u2500\u2500 auth\/ (Oauth API)\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 &#91;...nextauth]\/ \n\u2502   \u2502   \u2502       \u2514\u2500\u2500 route.ts \n\u2502   \u2502   \u2514\u2500\u2500 guestbookapp\/ (CRUD API)\n\u2502   \u2502       \u251c\u2500\u2500 &#91;id]\/ \n\u2502   \u2502       \u2502   \u2514\u2500\u2500 route.ts\n\u2502   \u2502       \u2514\u2500\u2500 route.ts \n\u2502   \u251c\u2500\u2500 guestbookapp\/ (FrontEnd)\n\u2502   \u2502   \u251c\u2500\u2500 GuestbookClient.tsx (Component)\n\u2502   \u2502   \u2514\u2500\u2500 page.tsx (Main Page)\n\u2502   \u251c\u2500\u2500 auth.ts (NextAuth Login)\n\u2502   \u251c\u2500\u2500 favicon.ico \n\u2502   \u251c\u2500\u2500 globals.css \n\u2502   \u251c\u2500\u2500 layout.tsx \n\u2502   \u2514\u2500\u2500 page.tsx (Project Main page)\n\u251c\u2500\u2500 .env.local(Environment variable)\n\u2514\u2500\u2500 local.db (SQLite Database)\n<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ud504\ub85c\uc81d\ud2b8 \uc124\uce58(myapp7)<br>Project Installation (myapp7)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npx create-next-app@latest<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 sqlite3 \ubaa8\ub4c8 \uc124\uce58<br>Install the sqlite3 module.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install better-sqlite3<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 NextAuth \ubaa8\ub4c8 \uc124\uce58<br>Install the NextAuth module.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install next-auth@beta<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\ud83d\udcc1 \uc11c\ubc84\uc2e4\ud589 \/ Start Servr<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm run dev<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \uc11c\ubc84 \uc811\uc18d \ubc0f \ud14c\uc2a4\ud2b8<br>Server Connection and Testing<\/p>\n\n\n\n<p>\u2714\ufe0f http:\/\/localhost:3000 \uc73c\ub85c \ube0c\ub77c\uc6b0\uc800\uc5d0 \uc811\uc18d\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"854\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp7-1-jpg.jpg\" alt=\"\" class=\"wp-image-7461\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp7-1-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp7-1-jpg-281x300.jpg 281w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp7-1-jpg-768x820.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp7-1-jpg-400x427.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">main page<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\ud83d\udcc1 \ucf54\ub4dc \uc124\uba85 \/ Code Explanation<\/p>\n\n\n\n<p>\u2714\ufe0f \uba54\uc778 \ud398\uc774\uc9c0 \ud30c\uc77c \ubd84\ub9ac \/ Separate main page files<\/p>\n\n\n\n<p>&#8212; \uc774\uc804 \ud504\ub85c\uc81d\ud2b8\uc758 page.tsx\uc5d0\uc11c page.tsx\uc640 GuestbookClient.tsx\ub85c \ud30c\uc77c \ubd84\ub9ac \ud588\uc2b5\ub2c8\ub2e4. <br>I split the <code>page.tsx<\/code> from the previous project into <code>page.tsx<\/code> and <code>GuestbookClient.tsx<\/code>.<\/p>\n\n\n\n<p>1)\uae30\uc874\uc758 Vite+React\ub294 \ud504\ub860\ud2b8\uc5d4\ub4dc\uc5d0\uc11c Express\uc11c\ubc84\ub85c \uac12\uc744 \ub118\uae30\uba74 \uc11c\ubc84\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud569\ub2c8\ub2e4.<br>In a standard Vite+React setup, when values \u200b\u200bare passed from the frontend to an Express server, the server processes the data.<br><br>2)\ucc98\ub9ac\ub41c \uac12\uc744 \ud504\ub860\ud2b8\uc5d4\ub4dc\ub85c \ub118\uae30\uba74 \ud504\ub860\ud2b8\uc5d4\ub4dc\uc5d0\uc11c \uac12\uc744 \ud654\uba74\uc5d0 \ud45c\uc2dc\ud558\uace0 UI\ub97c \ub2e4\uc2dc \uadf8\ub9bd\ub2c8\ub2e4. <br>When the processed value is passed to the frontend, the frontend displays the value on the screen and re-renders the UI.<br><br>3)Nextjs\uc5d0\uc11c\ub294 \ub530\ub85c \uc11c\ubc84\uc640 \ud504\ub860\ud2b8\uc5d4\ub4dc\uac00 \ud569\uccd0\uc838 \uc788\uc2b5\ub2c8\ub2e4.<br>In Next.js, the server and the front-end are integrated.<br><br>4)\ud558\uc9c0\ub9cc \uc11c\ubc84\uc5d0\uc11c \ucc98\ub9ac\ud560 \ub85c\uc9c1\uc774 \ud3ec\ud568\ub41c \ubd80\ubd84\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8 \ubd80\ubd84\uc758\uae30\ub2a5\uc744 \uac19\uc740 \ud30c\uc77c\uc5d0 \uc0ac\uc6a9 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<br>However, for the part containing logic to be processed on the server, you cannot use client-side functionality within the same file.<br><br>5)\uadf8\ub798\uc11c \ud30c\uc77c\uc744 \ubd84\ub9ac\ud569\ub2c8\ub2e4.<br>So, I am separating the files.<\/p>\n\n\n\n<p>&#8212; \uc544\ub798\ub294 page.tsx\uc5d0\uc11c GuestbookClient.tsx\ub97c \ucef4\ud3ec\ub10c\ud2b8 \ud615\uc2dd\uc73c\ub85c \ud638\ucd9c \ud569\ub2c8\ub2e4.<br>Below, <code>GuestbookClient.tsx<\/code> is called as a component within <code>page.tsx<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import GuestbookClient from \".\/GuestbookClient\"\n\n... \uc911\ub7b5 \/ Omitted ...\n      \n&lt;GuestbookClient\n   isLoggedIn={!!session?.user}\n   userEmail={session?.user?.email || \"\"}\n\/><\/code><\/pre>\n\n\n\n<p>1) isLoggedIn\uc740 \ub85c\uadf8\uc778 \uc5ec\ubd80\ub97c \ud655\uc778\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.<br>isLoggedIn is used to check whether the user is logged in.<\/p>\n\n\n\n<p>2)userEmail\uc740 \ub0b4\uac00 \uc4f4 \uae00\ub9cc \uc0ad\uc81c\ud558\uae30 \uc704\ud574\uc11c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<br><code>userEmail<\/code> is used to ensure that only the posts I have written are deleted.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ GuestbookClient.tsx\n\n{post.authorEmail === userEmail &amp;&amp; (\n     &lt;button onClick={() => handleDelete(post.id)} className=\"bg-red-500 text-white px-2 py-1 rounded text-xs ml-4 shrink-0\">\n        \uc0ad\uc81c\/Delete\n     &lt;\/button>\n)}<\/code><\/pre>\n\n\n\n<p>3)isLoggedIn={!!session?.user}\ud83d\udca1<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>3-1) \uc544\ub798\uc758 \uacbd\uc6b0\ub97c \ubcf4\uba74 name\uc5d0 2b\ub77c\ub294 \uac12\uc774 \ub4e4\uc5b4\uac00 \uc788\uace0 session.user\ub294 \uac1d\uccb4\uac00 \ub429\ub2c8\ub2e4.\nIn the case below, the value '2b' is assigned to `name`, and `session.user` becomes an object.\n\n3-2) !session?.user \uc774\ub807\uac8c \ud558\uba74 session.user\uc5d0 \uac12\uc774 \uc788\uc73c\uba74(true) false\ub85c \ubc14\uafc9\ub2c8\ub2e4.\nUsing `!session?.user` like this flips the value to `false` if `session.user` has a value (i.e., is truthy).\n\n3-3) !!session?.user \uc774\ub807\uac8c \ud558\uba74 true->false->true\ub85c \ubc14\uafc9\ub2c8\ub2e4.  \nUsing `!!session?.user` toggles the value from true to false and back to true.\n\n\/\/ ----------------------------------\n  session?.user = { name: \"2b\"... } \n  !session?.user = false\n  !!session?.user = true \n\/\/ ---------------------------------\n\n3-4) \uc704\uc640 \uac19\uc774 \uc0ac\uc6a9\ud558\ub294 \uc774\uc720\ub294 GuestbookClient.tsx\uc5d0\uc11c isLoggedIn\uc758 \ud0c0\uc785\uc774 boolen\uc774\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.\nThe reason for using it this way is that the type of `isLoggedIn` in `GuestbookClient.tsx` is `boolean`.\n\n\nexport default function GuestbookClient({ isLoggedIn, userEmail }: { <strong>isLoggedIn: boolean<\/strong>, userEmail: string }) { ...}<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \uae00 \uc0ad\uc81c \ub85c\uc9c1<br>Post deletion logic<\/p>\n\n\n\n<p>&#8212; \ub85c\uadf8\uc778\ud55c \uacbd\uc6b0 \ub85c\uadf8\uc778\ud55c \uc0ac\uc6a9\uc790\uc640 \uae00 \uc791\uc131\uc790\uac00 \uac19\uc740 \uacbd\uc6b0 \uc0ad\uc81c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br>If logged in, you can delete the post if the logged-in user is the same as the author.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ GuestbookClient.tsx\n\/\/ 56\ubc88\uc9f8 \uc904      \n\n{posts.map((post) => (\n\n\n            {post.authorEmail === userEmail &amp;&amp; (\n              &lt;button onClick={() => handleDelete(post.id)} className=\"bg-red-500 text-white px-2 py-1 rounded text-xs ml-4 shrink-0\">\n                \uc0ad\uc81c\/Delete\n              &lt;\/button>\n            )}\n\n))}<\/code><\/pre>\n\n\n\n<p>1)\uc0ad\uc81c\ubc84\ud2bc\uc744 \ubd80\ub974\uba74 handleDelete\ud568\uc218\ub97c \ud638\ucd9c\ud569\ub2c8\ub2e4<br>Clicking the delete button calls the <code>handleDelete<\/code> function.<\/p>\n\n\n\n<p>&#8212; handleDelete\ud568\uc218\uc785\ub2c8\ub2e4.<br>This is the handleDelete function.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ GuestbookClient.tsx \n\/\/ 37\ubc88\uc9f8 \uc904  \n\nconst handleDelete = async (id: number) => {\n    if (!confirm(\"\uc0ad\uc81c\ud560\uae4c\uc694?\/Are you sure you want to delete this post?\")) return;\n    await fetch(`\/api\/guestbookapp\/${id}`, { method: \"DELETE\" });\n    fetchPosts();\n  }<\/code><\/pre>\n\n\n\n<p>1) \uc704\uc758 \ucf54\ub4dc\uc5d0\uc11c \/api\/guestbookapp\/${id} \uc8fc\uc18c\ub85c DELETE \uc694\uccad\uc744 \ud569\ub2c8\ub2e4.<br>In the code above, a DELETE request is sent to the address <code>\/api\/guestbookapp\/${id}<\/code>.<\/p>\n\n\n\n<p>2) DELETE\ub294 POST,GET\uacfc \uac19\uc740 \uba54\uc18c\ub4dc\ub85c \uc774\ub984\uc744 \ubc14\uafc0 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<br>The DELETE method cannot be renamed to methods like POST or GET.<\/p>\n\n\n\n<p>3)${id} \uc774 \ubd80\ubd84\uc740 \ubcc0\uc218 \ubd80\ubd84\uc73c\ub85c \uae00\ubc88\ud638\uac00 \ub4e4\uc5b4\uac11\ub2c8\ub2e4. <br>The ${id} section is a variable placeholder where the post number is inserted.<\/p>\n\n\n\n<p>4)id\uc5d0 \uc5b4\ub5a4 \uc22b\uc790\uac00 \uc624\ub358 [id]\ub514\ub809\ud1a0\ub9ac\ub0b4\uc758 route.ts\uc2e4\ud589\ud558\uace0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uae00\uc744 \uc0ad\uc81c\ud569\ub2c8\ub2e4.<br>Regardless of the number for id, execute route.ts in the [id] directory and delete the post from the database.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { NextResponse } from 'next\/server';\nimport path from 'path';\nimport Database from 'better-sqlite3';\n\nconst dbPath = path.join(process.cwd(), 'local.db');\n\nexport async function DELETE(\n  req: Request,\n  { params }: { params: Promise&lt;{ id: string }> }\n) {\n  try {\n    const { id: idParam } = await params;\n    const id = Number(idParam);\n\n    console.log(\"\uc0ad\uc81c \uc694\uccad ID \/ Delete Request ID:\", id);\n\n    const db = new Database(dbPath);\n    const stmt = db.prepare('DELETE FROM posts WHERE id = ?');\n    const result = stmt.run(id);\n    db.close();\n\n    if (result.changes === 0) {\n      return NextResponse.json({ message: \"\ud574\ub2f9 \uae00\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.\/The post does not exist.\" }, { status: 404 });\n    }\n\n    return NextResponse.json({ ok: true });\n  } catch (error) {\n    console.error(\"\uc0ad\uc81c \uc624\ub958 \/ Delete Error:\", error);\n    return NextResponse.json({ message: \"\uc0ad\uc81c \uc2e4\ud328\/The deletion failed.\" }, { status: 500 });\n  }\n}<\/code><\/pre>\n\n\n\n<p>5)[id]\ub514\ub809\ud1a0\ub9ac\uc758 \uc704\uce58\ub294 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.<br>The location of the [id] directory is as follows.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>myapp7\/app\/api\/guestbookapp\/&#91;id]\/route.ts<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"698\" height=\"1024\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp7-2-jpg-698x1024.jpg\" alt=\"\" class=\"wp-image-7500\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp7-2-jpg-698x1024.jpg 698w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp7-2-jpg-205x300.jpg 205w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp7-2-jpg-768x1126.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp7-2-jpg-400x587.jpg 400w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp7-2-jpg.jpg 800w\" sizes=\"auto, (max-width: 698px) 100vw, 698px\" \/><figcaption class=\"wp-element-caption\">Login,delete button<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udc49\ud83c\udffb \uae30\uc874 \ud504\ub85c\uc81d\ud2b8\uc778 \ubc29\uba85\ub85d + sqlite\uc5d0 \uae43\ud5c8\ube0c \uc18c\uc15c\ub85c\uadf8\uc778(\uae43\ud5c8\ube0c) \uae30\ub2a5\uc744 \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4.I added a GitHub social login feature to the existing guestbook project (which uses SQLite). \ud83d\udc49\ud83c\udffb\uc18c\uc15c\ub85c\uadf8\uc778 \uae30\ub2a5\uacfc SQLite\uc5d0 \uae00 \uc785\ub825\ud558\ub294 \ubd80\ubd84\uc740 \uc774\uc804 \ud3ec\uc2a4\ud2b8\ub97c \ucc38\uc870\ud558\uc138\uc694Please refer to the previous post for the social login feature and the section on saving posts to SQLite. \ud83d\udc49\ud83c\udffb \uc774\uc804 \ud3ec\uc2a4\ud2b8 \/ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,1,7],"tags":[],"class_list":["post-7421","post","type-post","status-publish","format-standard","hentry","category-nextjs","category-uncategorized","category-website","missing-thumbnail"],"_links":{"self":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/7421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=7421"}],"version-history":[{"count":73,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/7421\/revisions"}],"predecessor-version":[{"id":7502,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/7421\/revisions\/7502"}],"wp:attachment":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=7421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=7421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=7421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}