Estoy tratando de enviar formData a través de la API de recuperación a una aplicación de nodo/express, y uso esos datos para actualizar una base de datos. No puedo acceder a formData en node. Si alguien pudiera señalar amablemente lo que estoy haciendo mal? He seguido varias otras respuestas pero ninguna ha ayudado.
Estoy usando javascript para adjuntar un detector de eventos al botón de envío y luego acceder a la API de búsqueda. El siguiente código da como resultado un req.body vacío.
Mi formulario html:
<form action="" method="POST" name="editQuestionForm" id="editQuestionForm" class="inputForm" > <input type="text" id="editInputQuestion" name="question" value="" class="formInput" placeholder="Question" /> <textarea type="text" id="editInputAnswer" name="answer" value="" class="formInput" placeholder="Answer" ></textarea> <button id="editQuestionBtn" class="button" type="Submit"> Edit Question </button> </form>Mi javascript:
const editQuestionForm = document.getElementById("editQuestionForm"); const editQuestionBtn = document.querySelector("#editQuestionBtn"); editQuestionBtn.addEventListener("click", function (e) { id = e.target.getAttribute("data-id"); updateQuestion(e, id); }); async function updateQuestion(e, id) { e.preventDefault(); var formData = new FormData(editQuestionForm); dataToSend = Object.fromEntries(formData); await fetch(`/dbControl/editQuestion?id=${id}`, { method: "POST", body: JSON.stringify(dataToSend), }); }Mi punto final en mi aplicación de nodo/express:
router.post("/editQuestion", function (req, res) { try { console.log(req.body); } catch (err) { console.log(err); } finally { res.end(); } });No está enviando un objeto FormData. Estás enviando JSON.
Está pasando una cadena a la propiedad del body , por lo que debe decir explícitamente que está enviando JSON. fetch no puede inferir que su cadena es JSON.
Este paso no sería necesario si estuviera enviando datos de formulario de varias partes pasando un objeto FormData, ni si estuviera enviando datos codificados en URL pasando un objeto URLSearchParams. fetch puede inferir el tipo de contenido de esos objetos.
await fetch(`/dbControl/editQuestion?id=${id}`, { method: "POST", body: JSON.stringify(dataToSend), headers: { "Content-Type": "application/json" } });Según la documentación :
Contiene pares clave-valor de datos enviados en el cuerpo de la solicitud. De forma predeterminada, no está definido y se completa cuando usa un middleware de análisis del cuerpo, como express.json() o express.urlencoded().
… necesita incluir algún middleware de análisis de cuerpo.
app.use(express.json());(Y hágalo antes de registrar el controlador de punto final).