如何将Content-Type:appication / x-www-form-urlencoded更改为application / json?

时间:2019-06-11 17:42:41

标签: node.js express

我正在尝试表达用户注册的意愿。我先制作了后端,由于我使用邮递员对其进行了验证,因此似乎工作正常。在邮递员中,我将Content-Type作为application / json包含在内,并将json数据包含在原始数据标签中。但是,在制作表单(名称,电子邮件,密码)时,我无法将此后端实现为前端。即使出现错误,我仍然无法包含姓名,电子邮件和密码。我试图console.log req.body并得到空数组。但是,在Chrome的网络标签中,名称,电子邮件和密码包含在表单数据中。我认为问题不在于body-parser,因为邮递员没有任何问题。在网络标签中,我看到请求的内容类型是Content-Type: application/x-www-form-urlencoded而不是application/json,我认为这可能是导致错误的原因。

server.js

app.use(express.json({ extended: false }));
app.get('/register', (req, res) => res.render('register'));
app.use('/api/users', require('./routes/api/users'));

api / users.js

// @ route    POST api/users
// @desc      Register User
// @access    Public
router.post(
  '/',
  [
    check('name', 'Name is required')
      .not()
      .isEmpty(),
    check('email', 'Please include a valid email').isEmail(),
    check(
      'password',
      ' Please enter a password with 6 or more characters'
    ).isLength({ min: 6 })
  ],
  async (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      console.log(req.body);
      return res.status(400).json({
        errors: errors.array()
      });
    }
    const { name, email, password } = req.body;
.
.
.

register.handlebars

  <form class="form" action="/api/users" method="post">
                <div class="form-group">
                    <input name="name" type="text" placeholder="Name" requried>
                </div>

                <div class="form-group">
                    <input name="email" type="email" placeholder="E-mail">
                </div>

                <div class="form-group">
                    <input name="password" type="text" placeholder="Password" minlength="6">
                </div>
                <input type="submit" value="Create account" class="button green-button" />
            </form>

1 个答案:

答案 0 :(得分:1)

express.json()是使用Content-Type: application/json的数据解析器。您在代码中使用它,这就是它在Postman中工作的原因。为了解析编码为application/x-www-form-urlencoded的数据,您只需要添加另一个解析器,在本例中为express.urlencoded()。此外,extended接受urlencoded()选项,而不是json()接受。

app.use(express.json()) // parses application/json
app.use(express.urlencoded({ extended: true })) // parses application/x-www-form-urlencoded