NodeJS Fetch POST方法在Express服务器上提供空正文

jtjikinw  于 2023-02-03  发布在  Node.js
关注(0)|答案(1)|浏览(145)

我从浏览器客户端发出POST请求:

const post = async (url, body) => {
        try {
            const response = await fetch(url, {
                method: `POST`,
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                },
                body
            });
            return response.json();
        } catch (error) {
            console.log(error.stack);
        }
    }
const data = await post(`http://localhost:4050/analyze`, { text });

我使用以下设置在Express服务器上处理它:

app.use(express.urlencoded({ extended: true }));

这是我的路线:

router.post(`/`, errorHandler(async (req, res, next) => {
    const { text } = req.body;
    console.log(req.body)

    const value = await analyze(text);

    res.json({ rephrased });
}));

console.log显示了以下内容:

{ 'object Object': '' }

为什么fetch方法给我Object而不是text属性?
更新:当我做字符串化:

method: `POST`,
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: JSON.stringify(body)

身体变成这样,console.log显示:

{ '{"text":"asdfasdf"}': '' }
0pizxfdo

0pizxfdo1#

您向fetch传递了body的一个普通对象,但它不知道如何处理它,因此它调用.toString(),但没有提供任何有用的信息。
传递一个URLSearchParams对象(这里我假设text是一个字符串)

const body = new URLSearchParams();
body.append("text", text);

这将转换为application/x-www-form-urlencoded字符串。
(You也可以忽略headers,因为fetch可以从URLSearchParams对象推断正确的Content-Type。)
重新编辑:JSON.stringify将数据编码为JSON。JSON不是application/x-www-form-urlencoded。

相关问题