req.body.email не определен

#javascript #node.js

#javascript #node.js

Вопрос:

Я внедряю сброс пароля, следуя руководству, но столкнулся с проблемой. Мой req.body.email возвращается неопределенным. У меня установлен анализатор тела, и мои другие маршруты работают отлично.

Вот краткое изложение моего кода:

 
var express = require('express');
var router = express.Router({ mergeParams: true });
var Kids = require('../models/kid');
var User = require('../models/user');
var async = require('async');
var nodemailer = require('nodemailer');
var crypto = require('crypto');
var middleware = require('../middleware');

router.post('/password_reset', function(req, res, next) {
 function(token, done) {
      User.findOne({ email: req.body.email }, function(err, user) {
          console.log(req.body.email);  <====== Returning and undefined
          console.log(user); <====== Returning as null
        if (!user) {
          req.flash('error', 'No account with that email address exists.');
          return res.redirect('/password_reset');
        }

        user.resetPasswordToken = token;
        user.resetPasswordExpires = Date.now()   3600000; // 1 hour

        user.save(function(err) {
          done(err, token, user);
        });
      });
    }
});
 

и моя форма

 <form action="/password_reset" method="POST" >
  <div class="form-group">
    <label for="exampleInputEmail1">Enter your email address</label>
    <input type="email" class="form-control" id="email" aria-describedby="emailHelp" placeholder="Enter email" required>
    
  </div>
  <button type="submit" class="btn btn-warning">Submit</button>
</form>

 

Комментарии:

1. Вы забыли запросить и настроить анализатор тела?

Ответ №1:

У вас две проблемы:

Вы не отправляете никаких данных

У вашего <input> нет name атрибута, поэтому он не может быть успешным элементом управления.

Если вы хотите req.body.email , чтобы в нем были данные, вам нужно сказать name="email" .

В связи с этим вы сказали <label for="exampleInputEmail1"> , но id="email" . for Атрибут должен соответствовать id элементу, который он помечает. Затем aria-describedby="emailHelp" необходимо сопоставить идентификатор элемента, который помечает текущий элемент … и не нужен, когда у вас есть real <label> .

Вы не анализируете отправленные данные

Смотрите Документацию для req.body :

Содержит пары ключ-значение данных, представленных в теле запроса. По умолчанию он не определен и заполняется при использовании промежуточного программного обеспечения для анализа тела, такого как express.json() или express.urlencoded().

Вы не использовали промежуточное программное обеспечение для анализа тела.

Ваша форма отправляет данные в urlencoded (по умолчанию), поэтому используйте express.urlencoded() :

 router.use(express.urlencoded())
 

Комментарии:

1. Большое вам спасибо, похоже, это была проблема с элементом управления формой.

2. Если он сообщает вам body-parser , что он устарел, это означает, что вы используете модуль body-parser из NPM вместо встроенного в Express, который, как я сказал, вы должны использовать. Если он сообщает вам, что вам нужно предоставить расширенную опцию, затем передайте объект options urlencoded() и установите extended значение true или false.