{"id":68392,"date":"2024-07-06T20:29:09","date_gmt":"2024-07-06T16:59:09","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/struggling-with-nodejs-5ch3\/"},"modified":"2024-07-06T20:29:09","modified_gmt":"2024-07-06T16:59:09","slug":"struggling-with-nodejs-5ch3","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/struggling-with-nodejs-5ch3\/","title":{"rendered":"\u0645\u0628\u0627\u0631\u0632\u0647 \u0628\u0627 Node.js &#8211; \u0627\u0646\u062c\u0645\u0646 DEV"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n            \u0645\u0646 \u0633\u0639\u06cc \u0645\u06cc \u06a9\u0646\u0645 \u0627\u0648\u0644\u06cc\u0646 \u0633\u0631\u0648\u0631 Node.js \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u06cc\u062a\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u06a9\u0644\u0627\u06cc\u0646\u062a \u0645\u06cc \u0633\u0627\u0632\u0645 \u0628\u0627 React Front-end \u06a9\u0627\u0631 \u06a9\u0646\u062f.  \u0645\u0646 \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0627\u0642\u0639\u06cc \u06a9\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0645 \u0628\u0627 Django REST \u0633\u0631\u0648\u06a9\u0627\u0631 \u062f\u0627\u0634\u062a\u0647 \u0627\u0645 \u0627\u0645\u0627 \u0634\u0646\u06cc\u062f\u0647 \u0627\u0645 \u06a9\u0647 Node.js \u0633\u0627\u062f\u0647 \u062a\u0631 \u0627\u0633\u062a \u0648 \u0634\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0645\u0646\u0627\u0633\u0628 \u062a\u0631 \u0627\u0633\u062a\u060c \u0645\u0646 \u0628\u0627 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0646\u06cc\u0632 \u0631\u0627\u062d\u062a \u062a\u0631 \u0647\u0633\u062a\u0645.<\/p>\n<p>\u0633\u0627\u062e\u062a\u0627\u0631 \u0627\u0635\u0644\u06cc \u0648\u0628 \u0633\u0627\u06cc\u062a:<\/p>\n<p>&#8211; \u0641\u0631\u0645\u06cc \u0628\u0631\u0627\u06cc \u0622\u067e\u0644\u0648\u062f \u062d\u062c\u0645 \u0632\u06cc\u0627\u062f\u06cc \u0627\u0632 \u0627\u0633\u0646\u0627\u062f PDF\u060c \u062a\u0635\u0627\u0648\u06cc\u0631\u060c \u0627\u0631\u0627\u0626\u0647 \u0647\u0627\u06cc \u067e\u0627\u0648\u0631 \u067e\u0648\u06cc\u0646\u062a.<br \/>\n&#8211; \u0642\u0627\u0628\u0644\u06cc\u062a \u062c\u0633\u062a\u062c\u0648 \u0628\u0631\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u06cc\u0627\u0641\u062a\u0646 PDF \u0647\u0627\u06cc \u062e\u0627\u0635 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0646\u0648\u06cc\u0633\u0646\u062f\u0647\u060c \u06a9\u0634\u0648\u0631\u060c \u062a\u0627\u0631\u06cc\u062e \u0622\u067e\u0644\u0648\u062f \u0648 \u0645\u0642\u0627\u062f\u06cc\u0631 \u062f\u06cc\u06af\u0631.<br \/>\n&#8211; \u0645\u0646 \u0627\u0632 React DocViewer \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0627\u0633\u0646\u0627\u062f PDF \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645.<\/p>\n<p>\u0645\u0634\u06a9\u0644:<\/p>\n<p>\u0645\u0634\u06a9\u0644\u06cc \u06a9\u0647 \u0627\u06a9\u0646\u0648\u0646 \u062f\u0627\u0631\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u062a\u0645\u0627\u0645 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a JSON \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u0645 \u0627\u0645\u0627 PDF \u0631\u0627 \u0627\u0632 \u06cc\u06a9 \u0633\u062a\u0648\u0646 \u0628\u0631 \u0627\u0633\u0627\u0633 FileId \u0628\u0627 DocViewer \u062f\u0631 ViewPdf.js \u0646\u0645\u0627\u06cc\u0634 \u0646\u0645\u06cc \u062f\u0647\u0645..\u0627\u06cc\u0646 \u0635\u0641\u062d\u0647 \u0628\u0631\u0627\u06cc DocViewer \u0627\u0633\u062a:<\/p>\n<p>import React, { useState, useEffect } from &#8216;react&#8217;;<br \/>\nimport { useParams } from &#8216;react-router-dom&#8217;;<br \/>\nimport DocViewer, { PDFRenderer, HTMLRenderer } from &#8220;react-doc-viewer&#8221;;<\/p>\n<p>const ViewPdf = () =&gt; {<br \/>\n    const { fileId } = useParams();<br \/>\n    const [fileUrl, setFileUrl] = useState(&#8221;)<\/p>\n<p>  useEffect(() =&gt; {<br \/>\n    \/\/ Construct the URL to fetch the file<br \/>\n    const url = `\/api\/uploads\/:fileId`;<\/p>\n<p>    setFileUrl(url);<br \/>\n  }, [fileUrl, fileId]);<\/p>\n<p>  const docs = [<br \/>\n    { uri: fileUrl }<br \/>\n  ];<\/p>\n<p>  return (<\/p>\n<p>    );<br \/>\n}<\/p>\n<p>export default ViewPdf;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>ViewPdf \u0628\u0627 \u0627\u06cc\u0646 \u0635\u0641\u062d\u0647 \u062c\u0633\u062a\u062c\u0648 \u0628\u0627\u0632 \u0645\u06cc \u0634\u0648\u062f:<\/p>\n<p>import React, { useEffect, useState } from &#8216;react&#8217;;<br \/>\nimport { useNavigate } from &#8216;react-router-dom&#8217;;<br \/>\nimport &#8216;@cds\/core\/select\/register.js&#8217;;<\/p>\n<p>function Search() {<br \/>\n  const navigate = useNavigate();<br \/>\n  const [uploads, setUploads] = useState([]);<br \/>\n  const [filter, setFilter] = useState({<br \/>\n    category: &#8221;,<br \/>\n    uploadDate: &#8221;,<br \/>\n    author: &#8221;,<br \/>\n    country: &#8221;<br \/>\n  });<\/p>\n<p>  useEffect(() =&gt; {<br \/>\n    fetch(&#8216;http:\/\/localhost:8000\/api\/uploads&#8217;)<br \/>\n      .then(response =&gt; response.json())<br \/>\n      .then(data =&gt; setUploads(data))<br \/>\n      .catch(error =&gt; console.error(&#8216;Error:&#8217;, error));<br \/>\n  }, []);<\/p>\n<p>  const handleFilterChange = (event) =&gt; {<br \/>\n    const { name, value } = event.target;<br \/>\n    setFilter(prevFilter =&gt; ({<br \/>\n      &#8230;prevFilter,<br \/>\n      [name]: value<br \/>\n    }));<br \/>\n  };<\/p>\n<p>  const filteredUploads = uploads.filter(upload =&gt; {<br \/>\n    const { category, uploadDate, author, country } = filter;<br \/>\n    return (<br \/>\n      (category === &#8221; || upload.category === category) &amp;&amp;<br \/>\n      (uploadDate === &#8221; || upload.uploaddate === uploadDate) &amp;&amp;<br \/>\n      (author === &#8221; || upload.author === author) &amp;&amp;<br \/>\n      (country === &#8221; || upload.country === country)<br \/>\n    );<br \/>\n  });<\/p>\n<p>  const handleFileClick = (upload) =&gt; {<br \/>\n    const fileId = upload.id;<br \/>\n    navigate(`\/api\/uploads\/${fileId}`);<br \/>\n  };<\/p>\n<p>  return (<\/p>\n<p>          Category:<\/p>\n<p>          Upload Date:<\/p>\n<p>          Author:<\/p>\n<p>          Country:<\/p>\n<p>            All<br \/>\n            USA<br \/>\n            Canada<br \/>\n            UK<br \/>\n            Albania<br \/>\n            Andorra<br \/>\n            Austria<br \/>\n            Belarus<br \/>\n            Belgium<br \/>\n            Bosnia and Herzegovina<br \/>\n            Bulgaria<br \/>\n            Croatia<br \/>\n            Cyprus<br \/>\n            Czech Republic<br \/>\n            Denmark<br \/>\n            Estonia<br \/>\n            Finland<br \/>\n            France<br \/>\n            Germany<br \/>\n            Greece<br \/>\n            Hungary<br \/>\n            Iceland<br \/>\n            Ireland<br \/>\n            Italy<br \/>\n            Kosovo<br \/>\n            Latvia<br \/>\n            Liechtenstein<br \/>\n            Lithuania<br \/>\n            Luxembourg<br \/>\n            Malta<br \/>\n            Moldova<br \/>\n            Monaco<br \/>\n            Montenegro<br \/>\n            Netherlands<br \/>\n            North Macedonia (formerly Macedonia)<br \/>\n            Norway<br \/>\n            Poland<br \/>\n            Portugal<br \/>\n            Romania<br \/>\n            Russia<br \/>\n            San Marino<br \/>\n            Serbia<br \/>\n            Slovakia<br \/>\n            Slovenia<br \/>\n            Spain<br \/>\n            Sweden<br \/>\n            Switzerland<br \/>\n            Ukraine<br \/>\n            United Kingdom (UK)<br \/>\n            Vatican City (Holy See)<\/p>\n<p>          {filteredUploads.sort((a, b) =&gt; new Date(b.uploaddate) &#8211; new Date(a.uploaddate)).map((upload, index) =&gt; (<br \/>\n             handleFileClick(upload)}&gt;<br \/>\n              Upload Date: {upload.uploaddate}<br \/>\n              Category: {upload.category}<br \/>\n              Country: {upload.country}<br \/>\n              Author: {upload.author}<br \/>\n              ID: {upload.id}<\/p>\n<p>          ))}<\/p>\n<p>  );<br \/>\n}<\/p>\n<p>export default Search;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc API \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u062f\u0631 Server.js \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<p>app.get(&#8220;\/api\/uploads\/:fileId&#8221;, async (req, res) =&gt; {<br \/>\n  const { fileId } = req.params;<br \/>\n  try {<br \/>\n    console.log([fileId]);<br \/>\n    const queryResult = await pool.query(<br \/>\n      &#8220;SELECT filename FROM uploads WHERE id = $1&#8221;,<br \/>\n      [fileId]\n    );<br \/>\n    if (queryResult.rows.length &gt; 0) {<br \/>\n      const { filename } = queryResult.rows[0];<br \/>\n      const filePath = path.join(__dirname, &#8220;uploads&#8221;, filename);<br \/>\n      res.sendFile(filePath);<br \/>\n    } else {<br \/>\n      res.status(404).json({ message: &#8220;File not found&#8221; });<br \/>\n    }<br \/>\n  } catch (err) {<br \/>\n    console.error(err);<br \/>\n    res.status(500).json({ message: &#8220;Internal server error&#8221; });<br \/>\n  }<br \/>\n});<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u0646 DocViewer \u0631\u0627 \u062f\u0631 \u0642\u0633\u0645\u062a \u062c\u0644\u0648\u06cc\u06cc \u0646\u0635\u0628 \u06a9\u0631\u062f\u0647 \u0627\u0645.  \u062d\u062f\u0633 \u0645\u0646 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u06a9\u0644 \u0627\u0632 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0634\u062a\u0628\u0627\u0647 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0622\u0646\u0686\u0647 \u06a9\u0647 \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u0646\u0645\u0627\u06cc\u0634 \u062f\u0647\u062f\u060c \u0646\u0647 JSON \u0628\u0644\u06a9\u0647 PDF\u060c \u0646\u0627\u0634\u06cc \u0645\u06cc \u0634\u0648\u062f.  \u06cc\u0627 \u0627\u06cc\u0646\u06a9\u0647 \u0645\u0648\u0646\u062a\u0627\u0698 \u0628\u0647 \u0646\u062d\u0648\u06cc \u062f\u0631 \u06cc\u06a9 \u062d\u0644\u0642\u0647 \u06af\u06cc\u0631 \u06a9\u0631\u062f\u0647 \u0648 \u0627\u062a\u0635\u0627\u0644 \u0631\u0627 \u0632\u0648\u062f\u062a\u0631 \u0645\u06cc \u0628\u0646\u062f\u062f.<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645 \u062a\u0644\u0627\u0634 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 PDF\u060c \u0627\u06cc\u0646 \u062e\u0637\u0627 \u0631\u0627 \u062f\u0627\u0631\u0645:<\/p>\n<p>ERROR<br \/>\nsignal is aborted without reason<br \/>\n    at http:\/\/localhost:3000\/static\/js\/bundle.js:23248:18<br \/>\n    at safelyCallDestroy (http:\/\/localhost:3000\/static\/js\/bundle.js:43291:9)<br \/>\n    at commitHookEffectListUnmount (http:\/\/localhost:3000\/static\/js\/bundle.js:43429:15)<br \/>\n    at commitPassiveUnmountOnFiber (http:\/\/localhost:3000\/static\/js\/bundle.js:45051:15)<br \/>\n    at commitPassiveUnmountEffects_complete (http:\/\/localhost:3000\/static\/js\/bundle.js:45031:11)<br \/>\n    at commitPassiveUnmountEffects_begin (http:\/\/localhost:3000\/static\/js\/bundle.js:45022:11)<br \/>\n    at commitPassiveUnmountEffects (http:\/\/localhost:3000\/static\/js\/bundle.js:44976:7)<br \/>\n    at flushPassiveEffectsImpl (http:\/\/localhost:3000\/static\/js\/bundle.js:46797:7)<br \/>\n    at flushPassiveEffects (http:\/\/localhost:3000\/static\/js\/bundle.js:46751:18)<br \/>\n    at http:\/\/localhost:3000\/static\/js\/bundle.js:46566:13<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 \u0635\u0641\u062d\u0647 \u0628\u0639\u062f \u0627\u0632 \u062e\u0637\u0627 \u062f\u0631 \u0635\u0641\u062d\u0647 ViewPdf.jsx \u0627\u0633\u062a:<\/p>\n<p>\u0646\u0648\u0634\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a: \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u06cc\u0646 \u0627\u0648\u0644\u06cc\u0646 \u062a\u0644\u0627\u0634 \u0645\u0646 \u0628\u0627 Node.js \u0627\u0633\u062a\u060c \u0627\u0632 \u0647\u0631\u06af\u0648\u0646\u0647 \u067e\u06cc\u0634\u0646\u0647\u0627\u062f\u06cc \u0627\u0633\u062a\u0642\u0628\u0627\u0644 \u0645\u06cc \u06a9\u0646\u0645.  \u0628\u0627 \u062a\u0634\u06a9\u0631 !<\/p>\n<div data-article-id=\"1913898\" id=\"article-body\">\n<p>\u0645\u0646 \u0633\u0639\u06cc \u0645\u06cc \u06a9\u0646\u0645 \u0627\u0648\u0644\u06cc\u0646 \u0633\u0631\u0648\u0631 Node.js \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u06cc\u062a\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u06a9\u0644\u0627\u06cc\u0646\u062a \u0645\u06cc \u0633\u0627\u0632\u0645 \u0628\u0627 React Front-end \u06a9\u0627\u0631 \u06a9\u0646\u062f.  \u0645\u0646 \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0627\u0642\u0639\u06cc \u06a9\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0645 \u0628\u0627 Django REST \u0633\u0631\u0648\u06a9\u0627\u0631 \u062f\u0627\u0634\u062a\u0647 \u0627\u0645 \u0627\u0645\u0627 \u0634\u0646\u06cc\u062f\u0647 \u0627\u0645 \u06a9\u0647 Node.js \u0633\u0627\u062f\u0647 \u062a\u0631 \u0627\u0633\u062a \u0648 \u0634\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0645\u0646\u0627\u0633\u0628 \u062a\u0631 \u0627\u0633\u062a\u060c \u0645\u0646 \u0628\u0627 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0646\u06cc\u0632 \u0631\u0627\u062d\u062a \u062a\u0631 \u0647\u0633\u062a\u0645.<\/p>\n<p><strong>\u0633\u0627\u062e\u062a\u0627\u0631 \u0627\u0635\u0644\u06cc \u0648\u0628 \u0633\u0627\u06cc\u062a:<\/strong><\/p>\n<ol>\n<li>&#8211; \u0641\u0631\u0645\u06cc \u0628\u0631\u0627\u06cc \u0622\u067e\u0644\u0648\u062f \u062d\u062c\u0645 \u0632\u06cc\u0627\u062f\u06cc \u0627\u0632 \u0627\u0633\u0646\u0627\u062f PDF\u060c \u062a\u0635\u0627\u0648\u06cc\u0631\u060c \u0627\u0631\u0627\u0626\u0647 \u0647\u0627\u06cc \u067e\u0627\u0648\u0631 \u067e\u0648\u06cc\u0646\u062a.<\/li>\n<li>&#8211; \u0642\u0627\u0628\u0644\u06cc\u062a \u062c\u0633\u062a\u062c\u0648 \u0628\u0631\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u06cc\u0627\u0641\u062a\u0646 PDF \u0647\u0627\u06cc \u062e\u0627\u0635 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0646\u0648\u06cc\u0633\u0646\u062f\u0647\u060c \u06a9\u0634\u0648\u0631\u060c \u062a\u0627\u0631\u06cc\u062e \u0622\u067e\u0644\u0648\u062f \u0648 \u0645\u0642\u0627\u062f\u06cc\u0631 \u062f\u06cc\u06af\u0631.<\/li>\n<li>&#8211; \u0645\u0646 \u0627\u0632 React DocViewer \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0627\u0633\u0646\u0627\u062f PDF \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645.<\/li>\n<\/ol>\n<p><strong>\u0645\u0634\u06a9\u0644:<\/strong><\/p>\n<p>\u0645\u0634\u06a9\u0644\u06cc \u06a9\u0647 \u0627\u06a9\u0646\u0648\u0646 \u062f\u0627\u0631\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u062a\u0645\u0627\u0645 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a JSON \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u0645 \u0627\u0645\u0627 PDF \u0631\u0627 \u0627\u0632 \u06cc\u06a9 \u0633\u062a\u0648\u0646 \u0628\u0631 \u0627\u0633\u0627\u0633 FileId \u0628\u0627 DocViewer \u062f\u0631 ViewPdf.js \u0646\u0645\u0627\u06cc\u0634 \u0646\u0645\u06cc \u062f\u0647\u0645.<br \/>.<br \/>\u0627\u06cc\u0646 \u0635\u0641\u062d\u0647 \u0628\u0631\u0627\u06cc DocViewer \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>import React, { useState, useEffect } from 'react';\nimport { useParams } from 'react-router-dom';\nimport DocViewer, { PDFRenderer, HTMLRenderer } from \"react-doc-viewer\";\n\n\nconst ViewPdf = () =&gt; {\n    const { fileId } = useParams();\n    const [fileUrl, setFileUrl] = useState('')\n\n  useEffect(() =&gt; {\n    \/\/ Construct the URL to fetch the file\n    const url = `\/api\/uploads\/:fileId`;\n\n    setFileUrl(url);\n  }, [fileUrl, fileId]);\n\n  const docs = [\n    { uri: fileUrl }\n  ];\n\n  return (\n\n      <docviewer pluginrenderers=\"{[PDFRenderer,\" htmlrenderer=\"\" documents=\"{docs}\" config=\"{{\" header:=\"\" retainurlparams:=\"\" true=\"\"\/>\n\n    );\n}\n\n\n\nexport default ViewPdf;\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>ViewPdf \u0628\u0627 \u0627\u06cc\u0646 \u0635\u0641\u062d\u0647 \u062c\u0633\u062a\u062c\u0648 \u0628\u0627\u0632 \u0645\u06cc \u0634\u0648\u062f:<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>import React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport '@cds\/core\/select\/register.js';\n\nfunction Search() {\n  const navigate = useNavigate();\n  const [uploads, setUploads] = useState([]);\n  const [filter, setFilter] = useState({\n    category: '',\n    uploadDate: '',\n    author: '',\n    country: ''\n  });\n\n\n  useEffect(() =&gt; {\n    fetch('http:\/\/localhost:8000\/api\/uploads')\n      .then(response =&gt; response.json())\n      .then(data =&gt; setUploads(data))\n      .catch(error =&gt; console.error('Error:', error));\n  }, []);\n\n  const handleFilterChange = (event) =&gt; {\n    const { name, value } = event.target;\n    setFilter(prevFilter =&gt; ({\n      ...prevFilter,\n      [name]: value\n    }));\n  };\n\n  const filteredUploads = uploads.filter(upload =&gt; {\n    const { category, uploadDate, author, country } = filter;\n    return (\n      (category === '' || upload.category === category) &amp;&amp;\n      (uploadDate === '' || upload.uploaddate === uploadDate) &amp;&amp;\n      (author === '' || upload.author === author) &amp;&amp;\n      (country === '' || upload.country === country)\n    );\n  });\n\n  const handleFileClick = (upload) =&gt; {\n    const fileId = upload.id;\n    navigate(`\/api\/uploads\/${fileId}`);\n  };\n\n  return (\n    <div style=\"{{\" display:=\"\" justifycontent:=\"\">\n      <div style=\"{{\" textalign:=\"\">\n        <p>\n          <label style=\"{{\" display:=\"\" width:=\"\">Category:<\/label>\n          <input type=\"text\" name=\"category\" value=\"{filter.category}\" onchange=\"{handleFilterChange}\"\/>\n        <\/p>\n        <p>\n          <label style=\"{{\" display:=\"\" width:=\"\">Upload Date:<\/label>\n          <input type=\"date\" name=\"uploadDate\" value=\"{filter.uploadDate}\" onchange=\"{handleFilterChange}\"\/>\n        <\/p>\n        <p>\n          <label style=\"{{\" display:=\"\" width:=\"\">Author:<\/label>\n          <input type=\"text\" name=\"author\" value=\"{filter.author}\" onchange=\"{handleFilterChange}\"\/>\n        <\/p>\n        <p>\n          <label style=\"{{\" display:=\"\" width:=\"\">Country:<\/label>\n          <select name=\"country\" value=\"{filter.country}\" onchange=\"{handleFilterChange}\">\n            <option value=\"\">All<\/option>\n            <option value=\"USA\">USA<\/option>\n            <option value=\"Canada\">Canada<\/option>\n            <option value=\"UK\">UK<\/option>\n            <option value=\"Albania\">Albania<\/option>\n            <option value=\"Andorra\">Andorra<\/option>\n            <option value=\"Austria\">Austria<\/option>\n            <option value=\"Belarus\">Belarus<\/option>\n            <option value=\"Belgium\">Belgium<\/option>\n            <option value=\"Bosnia and Herzegovina\">Bosnia and Herzegovina<\/option>\n            <option value=\"Bulgaria\">Bulgaria<\/option>\n            <option value=\"Croatia\">Croatia<\/option>\n            <option value=\"Cyprus\">Cyprus<\/option>\n            <option value=\"Czech Republic\">Czech Republic<\/option>\n            <option value=\"Denmark\">Denmark<\/option>\n            <option value=\"Estonia\">Estonia<\/option>\n            <option value=\"Finland\">Finland<\/option>\n            <option value=\"France\">France<\/option>\n            <option value=\"Germany\">Germany<\/option>\n            <option value=\"Greece\">Greece<\/option>\n            <option value=\"Hungary\">Hungary<\/option>\n            <option value=\"Iceland\">Iceland<\/option>\n            <option value=\"Ireland\">Ireland<\/option>\n            <option value=\"Italy\">Italy<\/option>\n            <option value=\"Kosovo\">Kosovo<\/option>\n            <option value=\"Latvia\">Latvia<\/option>\n            <option value=\"Liechtenstein\">Liechtenstein<\/option>\n            <option value=\"Lithuania\">Lithuania<\/option>\n            <option value=\"Luxembourg\">Luxembourg<\/option>\n            <option value=\"Malta\">Malta<\/option>\n            <option value=\"Moldova\">Moldova<\/option>\n            <option value=\"Monaco\">Monaco<\/option>\n            <option value=\"Montenegro\">Montenegro<\/option>\n            <option value=\"Netherlands\">Netherlands<\/option>\n            <option value=\"North Macedonia (formerly Macedonia)\">North Macedonia (formerly Macedonia)<\/option>\n            <option value=\"Norway\">Norway<\/option>\n            <option value=\"Poland\">Poland<\/option>\n            <option value=\"Portugal\">Portugal<\/option>\n            <option value=\"Romania\">Romania<\/option>\n            <option value=\"Russia\">Russia<\/option>\n            <option value=\"San Marino\">San Marino<\/option>\n            <option value=\"Serbia\">Serbia<\/option>\n            <option value=\"Slovakia\">Slovakia<\/option>\n            <option value=\"Slovenia\">Slovenia<\/option>\n            <option value=\"Spain\">Spain<\/option>\n            <option value=\"Sweden\">Sweden<\/option>\n            <option value=\"Switzerland\">Switzerland<\/option>\n            <option value=\"Ukraine\">Ukraine<\/option>\n            <option value=\"United Kingdom (UK)\">United Kingdom (UK)<\/option>\n            <option value=\"Vatican City (Holy See)\">Vatican City (Holy See)<\/option>\n          <\/select>\n        <\/p>\n        <ol>\n          {filteredUploads.sort((a, b) =&gt; new Date(b.uploaddate) - new Date(a.uploaddate)).map((upload, index) =&gt; (\n            <li key=\"{index}\" onclick=\"{()\"> handleFileClick(upload)}&gt;\n              <p style=\"{{\" display:=\"\" marginright:=\"\">Upload Date: {upload.uploaddate}<\/p>\n              <p style=\"{{\" display:=\"\" marginright:=\"\">Category: {upload.category}<\/p>\n              <p style=\"{{\" display:=\"\" marginright:=\"\">Country: {upload.country}<\/p>\n              <p style=\"{{\" display:=\"\" marginright:=\"\">Author: {upload.author}<\/p>\n              <p style=\"{{\" display:=\"\" marginright:=\"\">ID: {upload.id}<\/p>\n            <\/li>\n          ))}\n        <\/ol>\n      <\/div>\n    <\/div>\n  );\n}\n\nexport default Search;\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc API \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u062f\u0631 Server.js \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>app.get(\"\/api\/uploads\/:fileId\", async (req, res) =&gt; {\n  const { fileId } = req.params;\n  try {\n    console.log([fileId]);\n    const queryResult = await pool.query(\n      \"SELECT filename FROM uploads WHERE id = $1\",\n      [fileId]\n    );\n    if (queryResult.rows.length &gt; 0) {\n      const { filename } = queryResult.rows[0];\n      const filePath = path.join(__dirname, \"uploads\", filename);\n      res.sendFile(filePath);\n    } else {\n      res.status(404).json({ message: \"File not found\" });\n    }\n  } catch (err) {\n    console.error(err);\n    res.status(500).json({ message: \"Internal server error\" });\n  }\n});\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0646 DocViewer \u0631\u0627 \u062f\u0631 \u0642\u0633\u0645\u062a \u062c\u0644\u0648\u06cc\u06cc \u0646\u0635\u0628 \u06a9\u0631\u062f\u0647 \u0627\u0645.  \u062d\u062f\u0633 \u0645\u0646 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u06a9\u0644 \u0627\u0632 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0634\u062a\u0628\u0627\u0647 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0622\u0646\u0686\u0647 \u06a9\u0647 \u0633\u0631\u0648\u0631 \u0628\u0627\u06cc\u062f \u0646\u0645\u0627\u06cc\u0634 \u062f\u0647\u062f\u060c \u0646\u0647 JSON \u0628\u0644\u06a9\u0647 PDF\u060c \u0646\u0627\u0634\u06cc \u0645\u06cc \u0634\u0648\u062f.  \u06cc\u0627 \u0627\u06cc\u0646\u06a9\u0647 \u0645\u0648\u0646\u062a\u0627\u0698 \u0628\u0647 \u0646\u062d\u0648\u06cc \u062f\u0631 \u06cc\u06a9 \u062d\u0644\u0642\u0647 \u06af\u06cc\u0631 \u06a9\u0631\u062f\u0647 \u0648 \u0627\u062a\u0635\u0627\u0644 \u0631\u0627 \u0632\u0648\u062f\u062a\u0631 \u0645\u06cc \u0628\u0646\u062f\u062f.<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645 \u062a\u0644\u0627\u0634 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 PDF\u060c \u0627\u06cc\u0646 \u062e\u0637\u0627 \u0631\u0627 \u062f\u0627\u0631\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>ERROR\nsignal is aborted without reason\n    at http:\/\/localhost:3000\/static\/js\/bundle.js:23248:18\n    at safelyCallDestroy (http:\/\/localhost:3000\/static\/js\/bundle.js:43291:9)\n    at commitHookEffectListUnmount (http:\/\/localhost:3000\/static\/js\/bundle.js:43429:15)\n    at commitPassiveUnmountOnFiber (http:\/\/localhost:3000\/static\/js\/bundle.js:45051:15)\n    at commitPassiveUnmountEffects_complete (http:\/\/localhost:3000\/static\/js\/bundle.js:45031:11)\n    at commitPassiveUnmountEffects_begin (http:\/\/localhost:3000\/static\/js\/bundle.js:45022:11)\n    at commitPassiveUnmountEffects (http:\/\/localhost:3000\/static\/js\/bundle.js:44976:7)\n    at flushPassiveEffectsImpl (http:\/\/localhost:3000\/static\/js\/bundle.js:46797:7)\n    at flushPassiveEffects (http:\/\/localhost:3000\/static\/js\/bundle.js:46751:18)\n    at http:\/\/localhost:3000\/static\/js\/bundle.js:46566:13\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u0635\u0641\u062d\u0647 \u0628\u0639\u062f \u0627\u0632 \u062e\u0637\u0627 \u062f\u0631 \u0635\u0641\u062d\u0647 ViewPdf.jsx \u0627\u0633\u062a:<\/p>\n<p><br \/>\u0646\u0648\u0634\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a: \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u06cc\u0646 \u0627\u0648\u0644\u06cc\u0646 \u062a\u0644\u0627\u0634 \u0645\u0646 \u0628\u0627 Node.js \u0627\u0633\u062a\u060c \u0627\u0632 \u0647\u0631\u06af\u0648\u0646\u0647 \u067e\u06cc\u0634\u0646\u0647\u0627\u062f\u06cc \u0627\u0633\u062a\u0642\u0628\u0627\u0644 \u0645\u06cc \u06a9\u0646\u0645.  \u0628\u0627 \u062a\u0634\u06a9\u0631 !<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0645\u0646 \u0633\u0639\u06cc \u0645\u06cc \u06a9\u0646\u0645 \u0627\u0648\u0644\u06cc\u0646 \u0633\u0631\u0648\u0631 Node.js \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u06cc\u062a\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u06a9\u0644\u0627\u06cc\u0646\u062a \u0645\u06cc \u0633\u0627\u0632\u0645 \u0628\u0627 React Front-end \u06a9\u0627\u0631 \u06a9\u0646\u062f. \u0645\u0646 \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0627\u0642\u0639\u06cc \u06a9\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0645 \u0628\u0627 Django REST \u0633\u0631\u0648\u06a9\u0627\u0631 \u062f\u0627\u0634\u062a\u0647 \u0627\u0645 \u0627\u0645\u0627 \u0634\u0646\u06cc\u062f\u0647 \u0627\u0645 \u06a9\u0647 Node.js \u0633\u0627\u062f\u0647 \u062a\u0631 \u0627\u0633\u062a \u0648 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":68393,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-68392","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/68392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=68392"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/68392\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/68393"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=68392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=68392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=68392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}