You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Express API中打印通过JavaScript发送的FormData数据?

问题:Express API无法打印POST请求接收的数据

我通过JavaScript发送POST请求到Express API,但不知道如何在API端打印接收到的数据。

我的尝试

app.post("/register", (req,res) => {
    res.render("register/register", {});
    // 我试过用req.query、req.params或req.body打印,比如console.log(req.query)
})

前端JS代码

document.querySelector("#regForm").addEventListener('submit', e => {
    e.preventDefault();
    let username = document.querySelector("#username").value;

    let formData = new FormData(document.querySelector("#regForm"));
    
    console.log([...formData]);

    let data = JSON.stringify([...formData]);
    console.log(data)
        
    const request = new XMLHttpRequest();
    request.open("POST", '/register');
    request.send(data);
})

完整API代码

const express = require("express");
const path = require("path");
var bodyParser = require('body-parser')

const app = express();
const port = process.env.POST || "8080";

var jsonParser = bodyParser.json()
var urlencodedParser = bodyParser.urlencoded({ extended: false })

app.listen(port, () => {
    console.log(`Running on port ${port}`);
})
// middleware & static files
app.use(express.static('public'));
app.use(express.json());

app.set("view engine", "ejs");

app.use(express.static(__dirname + '/src'));
app.get("/profile/:name", (req,res) => {
    res.render("profile", {username:req.params.name});
})

app.get("/register", (req,res) => {
    res.render("register/register", {});
})

app.post("/register", jsonParser, (req,res) => {
    res.render("register/register", {});
    console.log(req.body)
})

遇到的错误

调整后出现JSON解析错误,无法正确解析请求体。


解决方案

1. 修复前端请求格式

你当前把FormData转成数组再序列化,生成的JSON格式不符合后端解析要求,同时没有设置正确的请求头。修改前端代码如下:

document.querySelector("#regForm").addEventListener('submit', e => {
    e.preventDefault();
    const formData = new FormData(document.querySelector("#regForm"));
    // 将FormData转为键值对对象
    const dataObj = Object.fromEntries(formData);
    // 序列化为JSON字符串
    const jsonData = JSON.stringify(dataObj);
    
    const request = new XMLHttpRequest();
    request.open("POST", '/register');
    // 必须设置请求头,告知后端请求体是JSON格式
    request.setRequestHeader('Content-Type', 'application/json');
    request.send(jsonData);
})

2. 简化后端中间件配置

Express已经内置了body-parser的功能,确保express.json()中间件在路由之前加载即可,无需在路由上重复指定jsonParser参数:

修改后端的POST路由:

app.post("/register", (req,res) => {
    // 先打印接收的数据再响应
    console.log("接收到的数据:", req.body);
    res.render("register/register", {});
})

验证

重启Express服务,重新提交表单,此时后端控制台应该能正确打印出前端发送的表单数据。


内容的提问来源于stack exchange,提问作者Almaszosz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:40:48