{"id":36942,"date":"2025-12-25T08:00:43","date_gmt":"2025-12-25T05:00:43","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/"},"modified":"2025-12-25T08:00:43","modified_gmt":"2025-12-25T05:00:43","slug":"dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/","title":{"rendered":"Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi"},"content":{"rendered":"<h2>Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131nda kullan\u0131c\u0131 ihtiya\u00e7lar\u0131na h\u0131zl\u0131ca adapte olabilen, esnek yap\u0131lar b\u00fcy\u00fck \u00f6nem ta\u015f\u0131maktad\u0131r. \u00d6zellikle anketler, geri bildirim formlar\u0131, ba\u015fvuru formlar\u0131 gibi veri toplama s\u00fcre\u00e7lerinde, formlar\u0131n statik olmas\u0131 yerine dinamik olarak olu\u015fturulabilmesi, hem geli\u015ftiricilere hem de son kullan\u0131c\u0131lara b\u00fcy\u00fck avantajlar sunar. Bu teknik makalede, React frontend&#8217;i, SurveyJS k\u00fct\u00fcphanesi, Node.js tabanl\u0131 bir backend ve MongoDB veritaban\u0131n\u0131 kullanarak nas\u0131l dinamik formlar olu\u015fturabilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Bu g\u00fc\u00e7l\u00fc teknoloji y\u0131\u011f\u0131n\u0131 ile, formlar\u0131n\u0131z\u0131 kod yazmadan, veritaban\u0131ndan gelen tan\u0131mlamalarla an\u0131nda \u015fekillendirebilirsiniz.<\/p>\n<h2>Dinamik Formlar Neden \u00d6nemli?<\/h2>\n<p>Dinamik formlar, i\u015fletmelerin ve geli\u015ftiricilerin de\u011fi\u015fen ihtiya\u00e7lara h\u0131zla yan\u0131t vermesini sa\u011flayan kritik bir yetenektir. Statik formlar\u0131n aksine, dinamik formlar, kodda de\u011fi\u015fiklik yapmaya gerek kalmadan form yap\u0131s\u0131n\u0131, alanlar\u0131n\u0131 ve do\u011frulama kurallar\u0131n\u0131 an\u0131nda g\u00fcncelleyebilme esnekli\u011fi sunar.<\/p>\n<h3>Esneklik ve Uyarlanabilirlik<\/h3>\n<p>\u0130\u015f s\u00fcre\u00e7leri ve kullan\u0131c\u0131 gereksinimleri s\u00fcrekli de\u011fi\u015febilir. Dinamik formlar sayesinde, yeni bir anket ba\u015flatmak, mevcut bir ba\u015fvuru formuna yeni bir alan eklemek veya bir geri bildirim formunun yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmek i\u00e7in aylarca s\u00fcren geli\u015ftirme d\u00f6ng\u00fclerine girmek zorunda kalmazs\u0131n\u0131z. Form \u015femalar\u0131n\u0131 veritaban\u0131nda saklayarak, bu de\u011fi\u015fiklikleri an\u0131nda devreye alabilirsiniz. Bu, \u00f6zellikle h\u0131zl\u0131 prototipleme ve A\/B testi gibi senaryolarda paha bi\u00e7ilmez bir avantaj sa\u011flar.<\/p>\n<h3>Kullan\u0131c\u0131 Deneyimi ve Verimlilik<\/h3>\n<p>Dinamik formlar, kullan\u0131c\u0131lar\u0131n yaln\u0131zca ilgili alanlar\u0131 g\u00f6rmesini sa\u011flayarak daha iyi bir kullan\u0131c\u0131 deneyimi sunar. \u00d6rne\u011fin, bir \u00f6nceki cevaba g\u00f6re sonraki sorular\u0131n g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fcn\u00fc de\u011fi\u015ftirebilirsiniz. Bu, formlar\u0131n daha k\u0131sa, daha anla\u015f\u0131l\u0131r ve doldurulmas\u0131 daha kolay olmas\u0131n\u0131 sa\u011flar, b\u00f6ylece kullan\u0131c\u0131lar\u0131n form doldurma oran\u0131n\u0131 art\u0131r\u0131r ve veri toplama verimlili\u011fini y\u00fckseltir. Ayr\u0131ca, karma\u015f\u0131k form mant\u0131klar\u0131n\u0131 (ko\u015fullu alanlar, atlama mant\u0131\u011f\u0131) kolayca uygulayabilirsiniz.<\/p>\n<h3>Bak\u0131m Kolayl\u0131\u011f\u0131 ve Maliyet Tasarrufu<\/h3>\n<p>Geli\u015ftirme s\u00fcrecinde esneklik, uzun vadede bak\u0131m maliyetlerini de d\u00fc\u015f\u00fcr\u00fcr. Her form de\u011fi\u015fikli\u011fi i\u00e7in kod taban\u0131n\u0131 g\u00fcncellemek, test etmek ve yeniden da\u011f\u0131tmak yerine, yaln\u0131zca veritaban\u0131ndaki form tan\u0131m\u0131n\u0131 d\u00fczenlemek yeterlidir. Bu, geli\u015ftirici zaman\u0131ndan tasarruf sa\u011flar ve hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 azalt\u0131r. Daha az kod, daha az hata ve daha h\u0131zl\u0131 g\u00fcncellemeler anlam\u0131na gelir, bu da toplam sahip olma maliyetini \u00f6nemli \u00f6l\u00e7\u00fcde d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<h2>Kullan\u0131lacak Teknolojilere Yak\u0131ndan Bak\u0131\u015f<\/h2>\n<p>Dinamik form \u00e7\u00f6z\u00fcm\u00fcm\u00fcz\u00fc olu\u015ftururken, her biri kendi alan\u0131nda g\u00fc\u00e7l\u00fc ve yayg\u0131n olarak kullan\u0131lan teknolojileri bir araya getirece\u011fiz. Bu kombinasyon, hem geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131racak hem de ortaya \u00e7\u0131kan uygulaman\u0131n performansl\u0131 ve \u00f6l\u00e7eklenebilir olmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>React: Modern Aray\u00fczler \u0130\u00e7in<\/h3>\n<p>React, Facebook taraf\u0131ndan geli\u015ftirilen ve kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in kullan\u0131lan pop\u00fcler bir JavaScript k\u00fct\u00fcphanesidir. Bile\u015fen tabanl\u0131 yap\u0131s\u0131 sayesinde, karma\u015f\u0131k UI&#8217;lar\u0131 y\u00f6netilebilir ve yeniden kullan\u0131labilir par\u00e7alara b\u00f6lerek geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r. Sanal DOM kullan\u0131m\u0131, performans\u0131 art\u0131r\u0131rken, geni\u015f ekosistemi ve topluluk deste\u011fi sayesinde her t\u00fcrl\u00fc frontend ihtiyac\u0131na \u00e7\u00f6z\u00fcm bulmak m\u00fcmk\u00fcnd\u00fcr. Dinamik formlar\u0131m\u0131z\u0131n frontend&#8217;ini olu\u015fturmak i\u00e7in React&#8217;in esnekli\u011finden faydalanaca\u011f\u0131z.<\/p>\n<h3>SurveyJS: Form Olu\u015fturman\u0131n G\u00fc\u00e7l\u00fc Arac\u0131<\/h3>\n<p>SurveyJS, dinamik formlar ve anketler olu\u015fturmak i\u00e7in tasarlanm\u0131\u015f kapsaml\u0131 bir JavaScript k\u00fct\u00fcphanesidir. Formlar\u0131 JSON tabanl\u0131 \u015femalarla tan\u0131mlaman\u0131za olanak tan\u0131r ve bu \u015femalar\u0131 farkl\u0131 frontend \u00e7er\u00e7evelerinde (React, Angular, Vue vb.) kolayca render edebilir. S\u00fcr\u00fckle-b\u0131rak form tasar\u0131mc\u0131s\u0131, ko\u015fullu mant\u0131k, veri do\u011frulama, farkl\u0131 soru tipleri ve tema deste\u011fi gibi zengin \u00f6zelliklere sahiptir. SurveyJS, formlar\u0131n g\u00f6rselle\u015ftirilmesi ve kullan\u0131c\u0131 etkile\u015fimini y\u00f6netme konusunda bize b\u00fcy\u00fck kolayl\u0131k sa\u011flayacakt\u0131r.<\/p>\n<h3>Node.js: Esnek ve \u00d6l\u00e7eklenebilir Backend<\/h3>\n<p>Node.js, JavaScript&#8217;i sunucu taraf\u0131nda \u00e7al\u0131\u015ft\u0131rmam\u0131z\u0131 sa\u011flayan bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Olay tabanl\u0131, asenkron yap\u0131s\u0131 sayesinde y\u00fcksek performansl\u0131 ve \u00f6l\u00e7eklenebilir backend servisleri geli\u015ftirmek i\u00e7in idealdir. Express.js gibi framework&#8217;lerle birle\u015fti\u011finde, RESTful API&#8217;ler olu\u015fturmak, veritaban\u0131 etkile\u015fimlerini y\u00f6netmek ve i\u015f mant\u0131\u011f\u0131n\u0131 uygulamak \u00e7ok daha kolay hale gelir. Form \u015femalar\u0131n\u0131 ve kullan\u0131c\u0131 g\u00f6nderimlerini y\u00f6netmek i\u00e7in Node.js ve Express.js&#8217;i kullanaca\u011f\u0131z.<\/p>\n<h3>MongoDB: NoSQL Veritaban\u0131 Se\u00e7imi<\/h3>\n<p>MongoDB, esnek, belge tabanl\u0131 (document-oriented) bir NoSQL veritaban\u0131d\u0131r. JSON benzeri BSON format\u0131nda verileri depolar, bu da form \u015femalar\u0131n\u0131 ve kullan\u0131c\u0131 g\u00f6nderimlerini do\u011frudan ve do\u011fal bir \u015fekilde saklamak i\u00e7in m\u00fckemmel bir se\u00e7imdir. \u015eemas\u0131z yap\u0131s\u0131 (schemaless), formlar\u0131n yap\u0131s\u0131 de\u011fi\u015fti\u011finde veritaban\u0131 \u015femas\u0131n\u0131 g\u00fcncelleme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r, bu da dinamik formlar\u0131n do\u011fas\u0131na \u00e7ok uygun bir \u00f6zelliktir. \u00d6l\u00e7eklenebilirlik ve y\u00fcksek performans sunmas\u0131 da cabas\u0131d\u0131r.<\/p>\n<h2>Mimari ve Genel Bak\u0131\u015f<\/h2>\n<p>Uygulamam\u0131z, modern web geli\u015ftirme pratiklerine uygun olarak \u00fc\u00e7 katmanl\u0131 bir mimariye sahip olacakt\u0131r: Frontend, Backend ve Veritaban\u0131. Bu katmanlar, birbirleriyle belirli aray\u00fczler \u00fczerinden ileti\u015fim kurarak sorumluluklar\u0131n net bir \u015fekilde ayr\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Frontend (React &#038; SurveyJS)<\/h3>\n<p>Frontend, kullan\u0131c\u0131n\u0131n etkile\u015fimde bulundu\u011fu aray\u00fcz\u00fc temsil eder. React ile olu\u015fturulan bu katman, SurveyJS k\u00fct\u00fcphanesini kullanarak dinamik formlar\u0131 render eder. Kullan\u0131c\u0131 bir formu doldurup g\u00f6nderdi\u011finde, bu veriler HTTP istekleri (genellikle POST) arac\u0131l\u0131\u011f\u0131yla backend&#8217;e iletilir. Ayr\u0131ca, formun hangi \u015femaya g\u00f6re olu\u015fturulaca\u011f\u0131n\u0131 belirlemek i\u00e7in de backend&#8217;den form \u015femalar\u0131n\u0131 (JSON format\u0131nda) \u00e7eker.<\/p>\n<h3>Backend (Node.js &#038; Express)<\/h3>\n<p>Backend, uygulaman\u0131n sunucu taraf\u0131ndaki mant\u0131\u011f\u0131n\u0131 bar\u0131nd\u0131r\u0131r. Node.js ve Express.js ile geli\u015ftirilen bu katman, RESTful API u\u00e7 noktalar\u0131 sa\u011flar. Frontend&#8217;den gelen form g\u00f6nderme isteklerini al\u0131r, bu verileri i\u015fler ve MongoDB&#8217;ye kaydeder. Ayn\u0131 zamanda, frontend&#8217;in talep etti\u011fi form \u015femalar\u0131n\u0131 MongoDB&#8217;den al\u0131p JSON format\u0131nda geri d\u00f6nd\u00fcrmekle de sorumludur. G\u00fcvenlik, veri do\u011frulama ve i\u015f mant\u0131\u011f\u0131 da bu katmanda uygulan\u0131r.<\/p>\n<h3>Veritaban\u0131 (MongoDB)<\/h3>\n<p>Veritaban\u0131, uygulaman\u0131n t\u00fcm kal\u0131c\u0131 verilerini saklar. MongoDB, esnek yap\u0131s\u0131 sayesinde form \u015femalar\u0131n\u0131 (JSON belgeleri olarak) ve kullan\u0131c\u0131lar\u0131n doldurdu\u011fu form g\u00f6nderimlerini (yine JSON belgeleri olarak) saklamak i\u00e7in idealdir. Her form \u015femas\u0131 ayr\u0131 bir belge olarak, her form g\u00f6nderimi de ba\u015fka bir belge olarak depolanabilir. Bu sayede, formlar\u0131n yap\u0131s\u0131 de\u011fi\u015fti\u011finde veritaban\u0131 \u015femas\u0131n\u0131 g\u00fcncelleme ihtiyac\u0131 ortadan kalkar.<\/p>\n<p>A\u015fa\u011f\u0131daki basit liste, veri ak\u0131\u015f\u0131n\u0131 \u00f6zetlemektedir:<\/p>\n<ul>\n<li><strong>1. Form Talebi:<\/strong> Frontend, belirli bir formun \u015femas\u0131n\u0131 backend&#8217;den ister (GET \/api\/forms\/:id).<\/li>\n<li><strong>2. \u015eema G\u00f6nderimi:<\/strong> Backend, MongoDB&#8217;den ilgili form \u015femas\u0131n\u0131 \u00e7eker ve frontend&#8217;e JSON olarak g\u00f6nderir.<\/li>\n<li><strong>3. Form Render:<\/strong> Frontend (React &#038; SurveyJS), gelen JSON \u015femas\u0131na g\u00f6re formu dinamik olarak olu\u015fturur ve kullan\u0131c\u0131ya sunar.<\/li>\n<li><strong>4. Form G\u00f6nderimi:<\/strong> Kullan\u0131c\u0131 formu doldurur ve g\u00f6nderir. Frontend, doldurulan veriyi backend&#8217;e POST iste\u011fi ile iletir (POST \/api\/forms\/:id\/submit).<\/li>\n<li><strong>5. Veri Kayd\u0131:<\/strong> Backend, gelen veriyi i\u015fler, do\u011frular ve MongoDB&#8217;ye yeni bir form g\u00f6nderimi belgesi olarak kaydeder.<\/li>\n<\/ul>\n<h2>Ad\u0131m Ad\u0131m Frontend Geli\u015ftirme (React &#038; SurveyJS)<\/h2>\n<p>Frontend uygulamam\u0131z\u0131 React ve SurveyJS kullanarak geli\u015ftirece\u011fiz. Bu b\u00f6l\u00fcmde, projenin kurulumundan formun render edilmesine ve backend ile ileti\u015fime kadar olan ad\u0131mlar\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>Proje Kurulumu ve Gerekli Paketler<\/h3>\n<p>\u0130lk olarak, yeni bir React projesi olu\u015ftural\u0131m ve SurveyJS k\u00fct\u00fcphanesini kural\u0131m.<\/p>\n<pre><code class=\"language-bash\">\nnpx create-react-app dynamic-forms-frontend\ncd dynamic-forms-frontend\nnpm install survey-react-ui survey-core axios\n<\/pre>\n<p><\/code><br \/>\n<code>axios<\/code> paketini backend ile HTTP istekleri yapmak i\u00e7in kullanaca\u011f\u0131z.<\/p>\n<h3>Form \u015eemas\u0131n\u0131 Tan\u0131mlama (JSON)<\/h3>\n<p>SurveyJS, form yap\u0131lar\u0131n\u0131 JSON format\u0131nda tan\u0131mlar. Bu JSON, backend'de saklanacak ve frontend taraf\u0131ndan \u00e7ekilerek form olu\u015fturulacakt\u0131r. \u0130\u015fte basit bir anket formu i\u00e7in \u00f6rnek bir JSON \u015femas\u0131:<\/p>\n<pre><code class=\"language-json\">\n{\n  \"title\": \"M\u00fc\u015fteri Geri Bildirim Formu\",\n  \"description\": \"Hizmetlerimiz hakk\u0131ndaki g\u00f6r\u00fc\u015flerinizi bizimle payla\u015f\u0131n.\",\n  \"pages\": [\n    {\n      \"name\": \"sayfa1\",\n      \"elements\": [\n        {\n          \"type\": \"text\",\n          \"name\": \"adSoyad\",\n          \"title\": \"Ad\u0131n\u0131z Soyad\u0131n\u0131z:\",\n          \"isRequired\": true\n        },\n        {\n          \"type\": \"radiogroup\",\n          \"name\": \"hizmetMemnuniyet\",\n          \"title\": \"Hizmetimizden genel olarak ne kadar memnunsunuz?\",\n          \"choices\": [\n            { \"value\": \"5\", \"text\": \"\u00c7ok Memnunum\" },\n            { \"value\": \"4\", \"text\": \"Memnunum\" },\n            { \"value\": \"3\", \"text\": \"Orta\" },\n            { \"value\": \"2\", \"text\": \"Memnun De\u011filim\" },\n            { \"value\": \"1\", \"text\": \"Hi\u00e7 Memnun De\u011filim\" }\n          ],\n          \"isRequired\": true\n        },\n        {\n          \"type\": \"comment\",\n          \"name\": \"ekYorum\",\n          \"title\": \"Ek yorumlar\u0131n\u0131z var m\u0131?\",\n          \"visibleIf\": \"{hizmetMemnuniyet} < 3\"\n        }\n      ]\n    }\n  ]\n}\n<\/pre>\n<p><\/code><br \/>\nYukar\u0131daki \u00f6rnekte, <code>ekYorum<\/code> alan\u0131 <code>hizmetMemnuniyet<\/code> de\u011feri 3'ten k\u00fc\u00e7\u00fckse g\u00f6r\u00fcn\u00fcr hale gelir. Bu, SurveyJS'in dinamik form yeteneklerine basit bir \u00f6rnektir.<\/p>\n<h3>Formu Render Etme ve Kullan\u0131c\u0131 Giri\u015flerini Yakalama<\/h3>\n<p><code>App.js<\/code> veya ayr\u0131 bir bile\u015fen i\u00e7inde SurveyJS formunu render edelim.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ src\/components\/DynamicForm.js\nimport React, { useState, useEffect } from 'react';\nimport { Survey } from 'survey-react-ui';\nimport { StylesManager, Model } from 'survey-core';\nimport 'survey-core\/defaultV2.min.css';\nimport axios from 'axios';\n\nStylesManager.applyTheme(\"defaultV2\"); \/\/ Tema uygulay\u0131n\n\nconst DynamicForm = ({ formId }) => {\n  const [surveyModel, setSurveyModel] = useState(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n  const backendUrl = process.env.REACT_APP_BACKEND_URL || 'http:\/\/localhost:5000';\n\n  useEffect(() => {\n    const fetchFormSchema = async () => {\n      try {\n        const response = await axios.get(<code>${backendUrl}\/api\/forms\/${formId}<\/code>);\n        const surveyJson = response.data.schema;\n        const model = new Model(surveyJson);\n        setSurveyModel(model);\n      } catch (err) {\n        console.error(\"Form \u015femas\u0131 \u00e7ekilirken hata olu\u015ftu:\", err);\n        setError(\"Form y\u00fcklenirken bir hata olu\u015ftu.\");\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    fetchFormSchema();\n  }, [formId, backendUrl]);\n\n  const onComplete = async (sender) => {\n    const formData = sender.data;\n    console.log(\"Form g\u00f6nderildi:\", formData);\n    try {\n      await axios.post(<code>${backendUrl}\/api\/forms\/${formId}\/submit<\/code>, formData);\n      alert(\"Form ba\u015far\u0131yla g\u00f6nderildi!\");\n      \/\/ \u0130ste\u011fe ba\u011fl\u0131: Formu s\u0131f\u0131rla veya kullan\u0131c\u0131y\u0131 ba\u015fka bir sayfaya y\u00f6nlendir\n    } catch (err) {\n      console.error(\"Form g\u00f6nderilirken hata olu\u015ftu:\", err);\n      alert(\"Form g\u00f6nderilirken bir hata olu\u015ftu.\");\n    }\n  };\n\n  if (loading) return <div>Form y\u00fckleniyor...<\/div>;\n  if (error) return <div style={{ color: 'red' }}>{error}<\/div>;\n  if (!surveyModel) return <div>Form bulunamad\u0131.<\/div>;\n\n  return <Survey model={surveyModel} onComplete={onComplete} \/>;\n};\n\nexport default DynamicForm;\n<\/pre>\n<p><\/code><br \/>\n<code>App.js<\/code> i\u00e7inde kullan\u0131m\u0131:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ src\/App.js\nimport React from 'react';\nimport DynamicForm from '.\/components\/DynamicForm';\nimport '.\/App.css';\n\nfunction App() {\n  \/\/ \u00d6rnek olarak bir form ID'si tan\u0131mlayal\u0131m.\n  \/\/ Ger\u00e7ek uygulamada bu ID URL'den veya ba\u015fka bir yerden gelebilir.\n  const exampleFormId = '654321098765432109876543'; \/\/ MongoDB ObjectId format\u0131nda bir ID\n\n  return (\n    <div className=\"App\">\n      <header className=\"App-header\">\n        <h2>Dinamik Form Uygulamas\u0131<\/h2>\n      <\/header>\n      <main>\n        <DynamicForm formId={exampleFormId} \/>\n      <\/main>\n    <\/div>\n  );\n}\n\nexport default App;\n<\/pre>\n<p><\/code><\/p>\n<h3>Backend ile \u0130leti\u015fim<\/h3>\n<p>Yukar\u0131daki kodda <code>axios.get<\/code> ile form \u015femas\u0131n\u0131 backend'den \u00e7ekiyor ve <code>axios.post<\/code> ile doldurulan form verilerini backend'e g\u00f6nderiyoruz. <code>formId<\/code> parametresi, hangi formun y\u00fcklenece\u011fini veya hangi forma ait verilerin g\u00f6nderilece\u011fini belirlemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h2>Ad\u0131m Ad\u0131m Backend Geli\u015ftirme (Node.js & MongoDB)<\/h2>\n<p>Backend'imiz Node.js ve Express.js ile olu\u015fturulacak, veritaban\u0131 olarak da MongoDB kullanaca\u011f\u0131z. Bu b\u00f6l\u00fcm, backend projesinin kurulumundan API u\u00e7 noktalar\u0131n\u0131n olu\u015fturulmas\u0131na kadar olan s\u00fcre\u00e7leri kapsar.<\/p>\n<h3>Proje Kurulumu ve Gerekli Paketler<\/h3>\n<p>Yeni bir Node.js projesi olu\u015ftural\u0131m ve gerekli paketleri kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">\nmkdir dynamic-forms-backend\ncd dynamic-forms-backend\nnpm init -y\nnpm install express mongoose cors dotenv\n<\/pre>\n<p><\/code><br \/>\n*   <code>express<\/code>: Web sunucusu ve API olu\u015fturmak i\u00e7in.<br \/>\n*   <code>mongoose<\/code>: MongoDB ile etkile\u015fim kurmak i\u00e7in ODM (Object Data Modeling) k\u00fct\u00fcphanesi.<br \/>\n*   <code>cors<\/code>: \u00c7apraz kaynak isteklerini (Cross-Origin Resource Sharing) y\u00f6netmek i\u00e7in.<br \/>\n*   <code>dotenv<\/code>: Ortam de\u011fi\u015fkenlerini <code>.env<\/code> dosyas\u0131ndan y\u00fcklemek i\u00e7in.<\/p>\n<p>Proje dizininde bir <code>.env<\/code> dosyas\u0131 olu\u015ftural\u0131m ve MongoDB ba\u011flant\u0131 URI'mizi ekleyelim:<\/p>\n<pre><code class=\"language-text\">\nMONGO_URI=mongodb:\/\/localhost:27017\/dynamicformsdb\nPORT=5000\n<\/pre>\n<p><\/code><\/p>\n<h3>MongoDB Ba\u011flant\u0131s\u0131 ve Veri Modeli<\/h3>\n<p><code>server.js<\/code> dosyam\u0131z\u0131 olu\u015ftural\u0131m ve MongoDB ba\u011flant\u0131s\u0131n\u0131 kural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ server.js\nrequire('dotenv').config();\nconst express = require('express');\nconst mongoose = require('mongoose');\nconst cors = require('cors');\n\nconst app = express();\nconst PORT = process.env.PORT || 5000;\nconst MONGO_URI = process.env.MONGO_URI;\n\n\/\/ Middleware'ler\napp.use(cors());\napp.use(express.json()); \/\/ JSON body'leri parse etmek i\u00e7in\n\n\/\/ MongoDB ba\u011flant\u0131s\u0131\nmongoose.connect(MONGO_URI)\n  .then(() => console.log('MongoDB ba\u015far\u0131yla ba\u011fland\u0131.'))\n  .catch(err => console.error('MongoDB ba\u011flant\u0131 hatas\u0131:', err));\n\n\/\/ Veri Modelleri\nconst formSchema = new mongoose.Schema({\n  name: { type: String, required: true, unique: true },\n  schema: { type: Object, required: true } \/\/ SurveyJS JSON \u015femas\u0131\n}, { timestamps: true });\n\nconst Form = mongoose.model('Form', formSchema);\n\nconst submissionSchema = new mongoose.Schema({\n  formId: { type: mongoose.Schema.Types.ObjectId, ref: 'Form', required: true },\n  formData: { type: Object, required: true } \/\/ Doldurulan form verileri\n}, { timestamps: true });\n\nconst Submission = mongoose.model('Submission', submissionSchema);\n\n\/\/ API U\u00e7 Noktalar\u0131 (a\u015fa\u011f\u0131da detayland\u0131r\u0131lacak)\n\/\/ ...\n\napp.listen(PORT, () => {\n  console.log(<code>Sunucu ${PORT} portunda \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});\n<\/pre>\n<p><\/code><br \/>\nYukar\u0131daki kodda iki adet Mongoose modeli tan\u0131mlad\u0131k:<br \/>\n*   <code>Form<\/code>: Dinamik formlar\u0131n JSON \u015femalar\u0131n\u0131 saklamak i\u00e7in. <code>name<\/code> alan\u0131 formun benzersiz ad\u0131n\u0131, <code>schema<\/code> alan\u0131 ise SurveyJS JSON'unu tutar.<br \/>\n*   <code>Submission<\/code>: Kullan\u0131c\u0131lar\u0131n doldurdu\u011fu form verilerini saklamak i\u00e7in. <code>formId<\/code> alan\u0131 hangi forma ait oldu\u011funu belirtir, <code>formData<\/code> ise doldurulan verileri i\u00e7erir.<\/p>\n<h3>API U\u00e7 Noktalar\u0131 Olu\u015fturma<\/h3>\n<p>\u015eimdi <code>server.js<\/code> dosyam\u0131za API rotalar\u0131n\u0131 ekleyelim:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ server.js (API U\u00e7 Noktalar\u0131 k\u0131sm\u0131)\n\n\/\/ Yeni bir form \u015femas\u0131 ekleme\napp.post('\/api\/forms', async (req, res) => {\n  try {\n    const { name, schema } = req.body;\n    if (!name || !schema) {\n      return res.status(400).json({ message: 'Form ad\u0131 ve \u015femas\u0131 zorunludur.' });\n    }\n    const newForm = new Form({ name, schema });\n    await newForm.save();\n    res.status(201).json(newForm);\n  } catch (error) {\n    if (error.code === 11000) { \/\/ Duplicate key error\n      return res.status(409).json({ message: 'Bu isimde bir form zaten mevcut.' });\n    }\n    console.error('Form eklenirken hata:', error);\n    res.status(500).json({ message: 'Sunucu hatas\u0131.' });\n  }\n});\n\n\/\/ Belirli bir form \u015femas\u0131n\u0131 ID'ye g\u00f6re getirme\napp.get('\/api\/forms\/:id', async (req, res) => {\n  try {\n    const form = await Form.findById(req.params.id);\n    if (!form) {\n      return res.status(404).json({ message: 'Form bulunamad\u0131.' });\n    }\n    res.status(200).json(form);\n  } catch (error) {\n    console.error('Form \u00e7ekilirken hata:', error);\n    res.status(500).json({ message: 'Sunucu hatas\u0131.' });\n  }\n});\n\n\/\/ Belirli bir forma ait g\u00f6nderimleri listeleme (iste\u011fe ba\u011fl\u0131)\napp.get('\/api\/forms\/:id\/submissions', async (req, res) => {\n  try {\n    const submissions = await Submission.find({ formId: req.params.id });\n    res.status(200).json(submissions);\n  } catch (error) {\n    console.error('G\u00f6nderimler \u00e7ekilirken hata:', error);\n    res.status(500).json({ message: 'Sunucu hatas\u0131.' });\n  }\n});\n\n\/\/ Form g\u00f6nderimlerini kaydetme\napp.post('\/api\/forms\/:id\/submit', async (req, res) => {\n  try {\n    const formId = req.params.id;\n    const formData = req.body;\n\n    \/\/ Formun ger\u00e7ekten var olup olmad\u0131\u011f\u0131n\u0131 kontrol edebiliriz\n    const existingForm = await Form.findById(formId);\n    if (!existingForm) {\n      return res.status(404).json({ message: 'G\u00f6nderim yap\u0131lacak form bulunamad\u0131.' });\n    }\n\n    const newSubmission = new Submission({ formId, formData });\n    await newSubmission.save();\n    res.status(201).json(newSubmission);\n  } catch (error) {\n    console.error('Form g\u00f6nderimi kaydedilirken hata:', error);\n    res.status(500).json({ message: 'Sunucu hatas\u0131.' });\n  }\n});\n\n\/\/ ... (app.listen kodu)\n<\/pre>\n<p><\/code><br \/>\nBu API u\u00e7 noktalar\u0131 \u015funlar\u0131 sa\u011flar:<br \/>\n*   <code>POST \/api\/forms<\/code>: Yeni bir form \u015femas\u0131 eklemek i\u00e7in kullan\u0131l\u0131r. Genellikle bir y\u00f6netici paneli taraf\u0131ndan \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <code>GET \/api\/forms\/:id<\/code>: Belirli bir formun JSON \u015femas\u0131n\u0131 frontend'e g\u00f6ndermek i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>POST \/api\/forms\/:id\/submit<\/code>: Kullan\u0131c\u0131n\u0131n doldurdu\u011fu form verilerini kaydetmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>Form \u015eemalar\u0131n\u0131 ve G\u00f6nderimleri Y\u00f6netme<\/h3>\n<p>Form \u015femalar\u0131n\u0131 ve g\u00f6nderimleri y\u00f6netmek i\u00e7in basit bir admin paneli olu\u015fturabilir veya Postman\/Insomnia gibi ara\u00e7lar\u0131 kullanabilirsiniz.<br \/>\n\u00d6rne\u011fin, Postman ile yeni bir form eklemek i\u00e7in:<br \/>\n*   Method: <code>POST<\/code><br \/>\n*   URL: <code>http:\/\/localhost:5000\/api\/forms<\/code><br \/>\n*   Headers: <code>Content-Type: application\/json<\/code><br \/>\n*   Body (raw JSON):<\/p>\n<pre><code class=\"language-json\">\n    {\n      \"name\": \"MusteriAnketi\",\n      \"schema\": {\n        \"title\": \"M\u00fc\u015fteri Geri Bildirim Formu\",\n        \"description\": \"Hizmetlerimiz hakk\u0131ndaki g\u00f6r\u00fc\u015flerinizi bizimle payla\u015f\u0131n.\",\n        \"pages\": [\n          {\n            \"name\": \"sayfa1\",\n            \"elements\": [\n              {\n                \"type\": \"text\",\n                \"name\": \"adSoyad\",\n                \"title\": \"Ad\u0131n\u0131z Soyad\u0131n\u0131z:\",\n                \"isRequired\": true\n              },\n              {\n                \"type\": \"radiogroup\",\n                \"name\": \"hizmetMemnuniyet\",\n                \"title\": \"Hizmetimizden genel olarak ne kadar memnunsunuz?\",\n                \"choices\": [\n                  { \"value\": \"5\", \"text\": \"\u00c7ok Memnunum\" },\n                  { \"value\": \"4\", \"text\": \"Memnunum\" },\n                  { \"value\": \"3\", \"text\": \"Orta\" },\n                  { \"value\": \"2\", \"text\": \"Memnun De\u011filim\" },\n                  { \"value\": \"1\", \"text\": \"Hi\u00e7 Memnun De\u011filim\" }\n                ],\n                \"isRequired\": true\n              }\n            ]\n          }\n        ]\n      }\n    }\n    <\/pre>\n<p><\/code><br \/>\nBu i\u015flem sonucunda MongoDB'ye bir form belgesi eklenecek ve d\u00f6nd\u00fcr\u00fclen <code>_id<\/code> de\u011ferini frontend'deki <code>exampleFormId<\/code> de\u011fi\u015fkenine atayabilirsiniz.<\/p>\n<h2>Uygulaman\u0131n Test Edilmesi ve Da\u011f\u0131t\u0131m\u0131<\/h2>\n<p>Uygulamay\u0131 geli\u015ftirdikten sonra, her iki katman\u0131n da beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in test etmek ve ard\u0131ndan canl\u0131ya almak \u00f6nemlidir.<\/p>\n<h3>Geli\u015ftirme Ortam\u0131nda Test<\/h3>\n<p>*   <strong>Backend'i Ba\u015flat\u0131n:<\/strong> <code>dynamic-forms-backend<\/code> dizininde <code>node server.js<\/code> veya <code>nodemon server.js<\/code> (nodemon kuruluysa) komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. Konsolda \"MongoDB ba\u015far\u0131yla ba\u011fland\u0131\" ve \"Sunucu 5000 portunda \u00e7al\u0131\u015f\u0131yor\" mesajlar\u0131n\u0131 g\u00f6rmelisiniz.<br \/>\n*   <strong>Frontend'i Ba\u015flat\u0131n:<\/strong> <code>dynamic-forms-frontend<\/code> dizininde <code>npm start<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. Bu, taray\u0131c\u0131n\u0131zda React uygulamas\u0131n\u0131 a\u00e7acakt\u0131r (genellikle <code>http:\/\/localhost:3000<\/code>).<br \/>\n*   <strong>Form Olu\u015fturma ve G\u00f6nderme:<\/strong> Frontend'de g\u00f6rd\u00fc\u011f\u00fcn\u00fcz formu doldurun ve g\u00f6nderin. Backend konsolunda form g\u00f6nderimiyle ilgili loglar\u0131 g\u00f6rmeli, MongoDB'de yeni bir <code>Submission<\/code> belgesinin olu\u015ftu\u011funu do\u011frulamal\u0131s\u0131n\u0131z.<\/p>\n<h3>G\u00fcvenlik ve Performans \u0130pu\u00e7lar\u0131<\/h3>\n<p>*   <strong>Veri Do\u011frulama:<\/strong> Hem frontend'de (SurveyJS'in yerle\u015fik do\u011frulama kurallar\u0131) hem de backend'de (Express middleware veya Mongoose \u015femalar\u0131 ile) veri do\u011frulama uygulay\u0131n. Bu, hatal\u0131 veya k\u00f6t\u00fc niyetli verilerin veritaban\u0131na kaydedilmesini \u00f6nler.<br \/>\n*   <strong>Kimlik Do\u011frulama ve Yetkilendirme:<\/strong> Form \u015femalar\u0131n\u0131 olu\u015fturma, g\u00fcncelleme veya silme gibi hassas i\u015flemler i\u00e7in kimlik do\u011frulama (\u00f6rne\u011fin JWT) ve yetkilendirme mekanizmalar\u0131 uygulay\u0131n. Herkesin form \u015femalar\u0131n\u0131 de\u011fi\u015ftirememesi gerekir.<br \/>\n*   <strong>CORS Politikalar\u0131:<\/strong> <code>cors<\/code> middleware'ini kullan\u0131rken, \u00fcretim ortam\u0131nda belirli domainlere izin veren daha k\u0131s\u0131tl\u0131 bir politika uygulay\u0131n. <code>app.use(cors({ origin: 'http:\/\/yourfrontenddomain.com' }));<\/code> gibi.<br \/>\n*   <strong>Hata Y\u00f6netimi:<\/strong> Uygulaman\u0131z\u0131n her katman\u0131nda kapsaml\u0131 hata y\u00f6netimi uygulay\u0131n. Kullan\u0131c\u0131ya dost\u00e7a hata mesajlar\u0131 g\u00f6sterirken, sunucu taraf\u0131nda detayl\u0131 loglama yap\u0131n.<br \/>\n*   <strong>Performans Optimizasyonu:<\/strong> B\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar i\u00e7in veritaban\u0131 indekslemesi, sorgu optimizasyonu ve \u00f6nbellekleme stratejilerini d\u00fc\u015f\u00fcn\u00fcn.<\/p>\n<h3>Da\u011f\u0131t\u0131m Stratejileri<\/h3>\n<p>*   <strong>Frontend Da\u011f\u0131t\u0131m\u0131:<\/strong> React uygulaman\u0131z\u0131 Vercel, Netlify, AWS S3 + CloudFront gibi statik site bar\u0131nd\u0131rma hizmetlerine da\u011f\u0131tabilirsiniz. <code>npm run build<\/code> komutuyla \u00fcretim i\u00e7in optimize edilmi\u015f bir yap\u0131 olu\u015fturulur.<br \/>\n*   <strong>Backend Da\u011f\u0131t\u0131m\u0131:<\/strong> Node.js backend'inizi Heroku, AWS EC2\/Lambda, Google Cloud Run, DigitalOcean Droplets gibi platformlara da\u011f\u0131tabilirsiniz. Bir Process Manager (PM2 gibi) kullanarak uygulaman\u0131z\u0131n s\u00fcrekli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak ve yeniden ba\u015flatmalar\u0131 y\u00f6netmek faydal\u0131 olacakt\u0131r.<br \/>\n*   <strong>Veritaban\u0131 Da\u011f\u0131t\u0131m\u0131:<\/strong> MongoDB'yi MongoDB Atlas gibi bulut tabanl\u0131 bir hizmette bar\u0131nd\u0131rmak veya kendi sunucunuzda kurmak m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makalede, React, Survey<\/p>\n","protected":false},"excerpt":{"rendered":"A\u015fa\u011f\u0131daki basit liste, veri ak\u0131\u015f\u0131n\u0131 \u00f6zetlemektedir:","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[676],"tags":[],"class_list":{"0":"post-36942","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-mongodb","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi\" \/>\n<meta property=\"og:description\" content=\"A\u015fa\u011f\u0131daki basit liste, veri ak\u0131\u015f\u0131n\u0131 \u00f6zetlemektedir:\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-25T05:00:43+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi\",\"datePublished\":\"2025-12-25T05:00:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/\"},\"wordCount\":2206,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"MongoDB\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/\",\"name\":\"Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-25T05:00:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi","og_description":"A\u015fa\u011f\u0131daki basit liste, veri ak\u0131\u015f\u0131n\u0131 \u00f6zetlemektedir:","og_url":"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-25T05:00:43+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi","datePublished":"2025-12-25T05:00:43+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/"},"wordCount":2206,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["MongoDB"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/","name":"Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-25T05:00:43+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/dinamik-formlari-react-surveyjs-node-js-ve-mongodb-ile-olusturma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Dinamik Formlar\u0131 React, SurveyJS, Node.js ve MongoDB ile Olu\u015fturma Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36942","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36942"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36942\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36942"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36942"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36942"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}