NodeJS 即使在表单中填写了字段,req.body也会继续返回空字段

y1aodyip  于 2023-05-17  发布在  Node.js
关注(0)|答案(1)|浏览(101)

我有一个表单,我想为我的鞋子写一个评论,然后通过POST请求将其发送到我的node.js服务器,但我的req.body.comment一直返回一个空字符串,即使我的表单中的评论已经填写完毕。
在我的routes文件中,我有以下代码行:router.post(“/shoe/:id”,shoe_controller.shoe_details_post);
然后在我实际的shoe控制器文件中,我是这样填写我的shoe_details_post函数的:

exports.shoe_details_post = [
  // Validate and sanitize comment field
  body("comment", "Comment must not be empty.")
    .trim()
    .isLength({ min: 1 })
    .escape(),
  // Process request after validation and sanitization

  asyncHandler(async (req, res, next) => {
    // Extract the validation errors from a request.
    const errors = validationResult(req);
    console.log(errors);

    const shoe = Shoe.findById(req.params.id);
    const comment = req.body.comment;

    console.log(req.body);

    // console.log("hi!" + shoe);
    console.log("comment:  " + comment);
    // console.log(req.user);

    res.redirect('/catalog');
  }),
];

我的表单页面如下所示:扩展布局

block content
  h1 #{shoe.name}

  img(src=`/images/shoe_images/jordan4.jpeg`)

  form(method='POST' action='' enctype='multipart/form-data')
    div.form-group
      label(class="shoe-detail-comment-box" for='comment') Comment:
      textarea#summary.form-control(type='textarea', placeholder='Comment here', name='comment', required='true')
    button.btn.btn-primary(type='submit') Submit

在我的shoe_controller文件中我有另一个类似的方法,我做了几乎完全相同的事情,但对于不同的表单,效果很好,但由于某种原因,这个方法没有。在我的另一个函数中,我还验证和清理了表单中的适当字段,并能够获取字段的值。然而,在这一个,无论我做什么,我的评论总是空的。

nsc4cvqm

nsc4cvqm1#

默认情况下,Express不会读取任何请求的主体。它只读取头部,并将主体留在流中,等待知道如何处理特定内容类型的中间件或请求处理程序读取和解析请求主体。因此,表单数据到达请求主体,但您没有指定任何Express中间件来读取它。因此req.body保持为空。
要解决这个问题,首先将表单内容类型更改为application/x-www-form-urlencodedmultipart/form-data可以工作,但在服务器上更难编码,这里不需要(通常用于一个或多个文件上传,当表单有多个部分要上传时,表单内容加上附加文件)。

block content
  h1 #{shoe.name}

  img(src=`/images/shoe_images/jordan4.jpeg`)

  form(method='POST' action='' enctype='application/x-www-form-urlencoded')
    div.form-group
      label(class="shoe-detail-comment-box" for='comment') Comment:
      textarea#summary.form-control(type='textarea', placeholder='Comment here', name='comment', required='true')
    button.btn.btn-primary(type='submit') Submit

然后,您需要适当的Express中间件来读取该内容类型。你可以这样添加:

app.use(express.urlencoded());

确保此中间件出现在表单的请求处理程序之前。您只需要在Express服务器上指定一次,因为它将应用于与该内容类型匹配的所有传入请求。
这将告诉express,无论何时它发现任何内容类型为application/x-www-form-urlencoded的请求,该中间件都应该读取请求的主体,使用application/x-www-form-urlencoded中的预期编码对其进行解析,并将解析结果放入req.body中,然后数据将在请求处理程序中为您准备好。对于不是application/x-www-form-urlencoded的传入请求,中间件将不做任何事情。

相关问题