Как изменить Content-Type: appication / x-www-form-urlencoded для application / json? - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь сделать регистрацию пользователя экспрессом.Сначала я создал бэкэнд, и он, кажется, работает нормально, так как я проверил его с помощью почтальона.В почтальоне я включил Content-Type в качестве application / json, а данные json - во вкладку необработанных данных.Тем не менее, я не мог реализовать этот бэкэнд для внешнего интерфейса при создании формы (имя, адрес электронной почты, пароль).Я получил ошибки, чтобы включить имя, адрес электронной почты и пароль, хотя я и сделал.Я попытался console.log req.body и получил пустой массив.Однако на вкладке сети в Chrome имя, адрес электронной почты и пароль включены в данные формы и.Я не думаю, что проблема была с парсером, потому что у почтальона не было никаких проблем.На вкладке сети я увидел, что Content-Type для req был 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 Ответ

1 голос
/ 11 июня 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...