#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, который, как я сказал, вы должны использовать. Если он сообщает вам, что вам нужно предоставить расширенную опцию, затем передайте объект optionsurlencoded()
и установитеextended
значение true или false.