为什么 Express.js 可以读取一些 req.body 变量而不是其他变量?

问题描述 投票:0回答:1

首先,我没有使用 body-parser,经过一些研究后看来我应该使用。其次,我还有一个问题,为什么我的一些变量可以在没有 body-parser 的情况下通过 req.body 读取,但其他变量却显示为未定义?

我有 5 个变量:title(string)、text(string)、picturePath(object)、fruit(string) 和 test(string)。

当我在后端console.log“标题”、“文本”和“测试”时,它们会显示正确的值,而“picturePath”和“水果”显示为未定义。当我在前端 console.log 时,所有变量都会显示其正确值。有人可以解释一下为什么后端只有一些更改为未定义吗?

router.put("/:id/two", VerifyToken, upload.single("file"), async (req, res) => {
    try {
        const blogPostId = req.params.id;
        const { title, text, picturePath, fruit, test } = req.body;
        if (req.file === undefined) {
            const data = await BlogPostsModel.findByIdAndUpdate(blogPostId, { title, text });
            if (!data) {
                throw new Error('An error occurred while updating blog post')
            }
            res.status(200).json(data);
        }
        else {
            const data = await BlogPostsModel.findByIdAndUpdate(blogPostId, { title, text, picturePath: req.file.filename });
            if (!data) {
                throw new Error('An error occurred while updating blog post')
            }
            res.status(200).json(data);
        }
    }
    catch (error) {
        res.status(500).json({error: 'An error occurred while updating blog post...'})
        
    }
})

前端PUT请求函数:

const UpdateBlogPost = async (e, title, text, picturePath, test) =>{
    e.preventDefault();
    console.log(typeof(picturePath), typeof(title), typeof(text), typeof(fruit), typeof(test))

    try {
        const formdata = new FormData()
        formdata.append('file', picturePath)
        formdata.append('title', title)
        formdata.append('text', text)
        formdata.append('base', fruit)
        formdata.append('test', test)

        const response = await fetch(`${baseUrl}/blogPosts/${blogpostId}`, {
            method: "PUT",
            headers: { authorization: token},
            body: formdata
        })

        if (response.ok) {
            Navigate(`/blogPost/${blogpostId}`);
        }
    }
    catch(error){
        console.log(error);
    }
}
javascript reactjs node.js express
1个回答
-1
投票

取决于您如何从 POSTMAN 或前端发送数据。无论如何,对于 json body 请求,您应该使用 body-parser。

在不使用 body-parser 的情况下使用 req.body 时,您似乎在 Node.js 后端中的变量行为方面遇到了一些困惑。让我们澄清一下:

您提到,登录时标题、文本和测试在后端正确显示,但图片路径和水果未定义。这可能是因为标题、文本和测试是简单的字符串变量,而图片路径和水果可能是对象或更复杂的数据类型。

在 Express.js 中,要解析传入的请求正文,您确实需要使用像 body-parser 这样的中间件(对于 v4.16 之前的 Express 版本,默认包含它)。如果没有主体解析中间件,Express 不会自动解析传入请求的主体,因此 req.body 将为空或未定义,除非您以某种方式解析了它。

© www.soinside.com 2019 - 2024. All rights reserved.