首页 > 解决方案 > req.body.email 未定义

问题描述

我正在按照教程实施密码重置,但遇到了问题。我的 req.body.email 回来未定义。我安装了 body-parser 并且我的其他路线运行良好。

这是我的代码摘要:


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>

标签: javascriptnode.js

解决方案


你有两个问题:

您没有提交任何数据

<input>没有name属性,所以不能成功控制。

如果您想req.body.email在其中包含数据,那么您需要说name="email".

与此相关,您说<label for="exampleInputEmail1">但是id="email"。该for属性需要与id它所标记的元素相匹配。然后aria-describedby="emailHelp"需要匹配标记当前元素的元素的 ID……当你有一个真正的<label>.

您没有解析提交的数据

请参阅文档req.body

包含在请求正文中提交的数据键值对。默认情况下,它是 undefined,并且在您使用诸如 express.json() 或 express.urlencoded() 之类的正文解析中间件时填充。

您还没有使用任何正文解析中间件。

您的表单正在提交 urlencoded 数据(默认),因此请使用express.urlencoded()

router.use(express.urlencoded())

推荐阅读