如何通过 fetch 到 node 和 express 发送和接收 formData?
How to send and receive formData through fetch to node and express?
我正在尝试通过提取 API 将 formData 发送到 node/express 应用程序,并使用该数据更新数据库。我无法访问节点中的 formData。如果有人可以指出我做错了什么?我遵循了其他几个答案,但 none 有所帮助。
我正在使用 javascript 将事件侦听器附加到提交按钮,然后访问提取 API。下面的代码导致空 req.body.
我的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>
我的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),
});
}
我的 node/express 应用程序中的端点:
router.post("/editQuestion", function (req, res) {
try {
console.log(req.body);
} catch (err) {
console.log(err);
} finally {
res.end();
}
});
Content-Type
您没有发送 FormData 对象。您正在发送 JSON.
您正在向 body
属性 传递一个字符串,因此您需要明确说明您正在发送 JSON。 fetch
无法推断您的字符串是 JSON.
如果您通过传递 FormData 对象发送多部分表单数据,或者如果您通过传递 URLSearchParams 对象发送 URL 编码数据,则不需要此步骤。 fetch
可以 从这些对象中推断出 content-type。
await fetch(`/dbControl/editQuestion?id=${id}`, {
method: "POST",
body: JSON.stringify(dataToSend),
headers: {
"Content-Type": "application/json"
}
});
正文解析中间件
根据 documentation:
Contains key-value pairs of data submitted in the request body. By default, it is undefined, and is populated when you use body-parsing middleware such as express.json() or express.urlencoded().
…你需要包含一些正文解析中间件。
app.use(express.json());
(并在注册终点处理程序之前执行此操作)。
我正在尝试通过提取 API 将 formData 发送到 node/express 应用程序,并使用该数据更新数据库。我无法访问节点中的 formData。如果有人可以指出我做错了什么?我遵循了其他几个答案,但 none 有所帮助。
我正在使用 javascript 将事件侦听器附加到提交按钮,然后访问提取 API。下面的代码导致空 req.body.
我的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>
我的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),
});
}
我的 node/express 应用程序中的端点:
router.post("/editQuestion", function (req, res) {
try {
console.log(req.body);
} catch (err) {
console.log(err);
} finally {
res.end();
}
});
Content-Type
您没有发送 FormData 对象。您正在发送 JSON.
您正在向 body
属性 传递一个字符串,因此您需要明确说明您正在发送 JSON。 fetch
无法推断您的字符串是 JSON.
如果您通过传递 FormData 对象发送多部分表单数据,或者如果您通过传递 URLSearchParams 对象发送 URL 编码数据,则不需要此步骤。 fetch
可以 从这些对象中推断出 content-type。
await fetch(`/dbControl/editQuestion?id=${id}`, {
method: "POST",
body: JSON.stringify(dataToSend),
headers: {
"Content-Type": "application/json"
}
});
正文解析中间件
根据 documentation:
Contains key-value pairs of data submitted in the request body. By default, it is undefined, and is populated when you use body-parsing middleware such as express.json() or express.urlencoded().
…你需要包含一些正文解析中间件。
app.use(express.json());
(并在注册终点处理程序之前执行此操作)。