首先,我没有使用 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);
}
}
取决于您如何从 POSTMAN 或前端发送数据。无论如何,对于 json body 请求,您应该使用 body-parser。
在不使用 body-parser 的情况下使用 req.body 时,您似乎在 Node.js 后端中的变量行为方面遇到了一些困惑。让我们澄清一下:
您提到,登录时标题、文本和测试在后端正确显示,但图片路径和水果未定义。这可能是因为标题、文本和测试是简单的字符串变量,而图片路径和水果可能是对象或更复杂的数据类型。
在 Express.js 中,要解析传入的请求正文,您确实需要使用像 body-parser 这样的中间件(对于 v4.16 之前的 Express 版本,默认包含它)。如果没有主体解析中间件,Express 不会自动解析传入请求的主体,因此 req.body 将为空或未定义,除非您以某种方式解析了它。