req.body未定义或为空

时间:2019-01-31 14:44:23

标签: javascript node.js forms express

我必须有两个控制器和两个单独的路由器。 bookController.js运行完美。现在,我创建了userControllers来处理注册和登录逻辑,但是req.body为空。我试图用console.log查看表单是否通过。但我变成空的或未定义的

我不知道自己在做什么或做错了什么

谢谢

这是app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
//const csurf = require('csurf');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var methodOverride = require('method-override')
//const multer = require('multer'); 

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var bookRouter = require('./routes/book');


//Cross site request forgery
//const csrfMiddleware = csurf({cookie: true});

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.use(cookieParser());
//app.use(csrfMiddleware);
app.use(methodOverride('_method'))
//app.use(multerConfig );

app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/', bookRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

usersControllers.js

const knex = require('../model/connection');

exports.register = function(req, res)
{
    //REGISTER USER FORM PAGE
    res.render('user/register');

}

exports.registeruser = function(req, res, next)
{
    //REGISTER USER HANDLE
    console.log(req.body.username);
    console.log(req.body.email);
    console.log(req.body.password);
    console.log(req.body.password1);
    res.render('user/dashboard');
}

这是route / users.js

var express = require('express');
var router = express.Router();
var usersControllers = require('../controllers/usersControllers');

/* GET users listing. */
router.get('/dashboard', usersControllers.index); 
router.get('/register', usersControllers.register); 
router.get('/login', usersControllers.login); 
router.post('/registeruser', usersControllers.registeruser); 


module.exports = router;

这是表格

<%- include('../includes/layout'); %>
<div class="container">
    <div class="row">
        <div class="col-lg-3"></div>
<div class="col-lg-6">
        <div class="card">
          <div class="card-header bg-primary"> Create User </div>
           <form id="c_form-h" class="" method="post" action="/users/registeruser" enctype="multipart/form-data" style="padding: 5px;">  


          <div class="form-group row">
               <label for="username" class="col-6 col-form-label">Username</label>
           <div class="col-12">
              <input type="text" class="form-control" name="username" placeholder="Add UserName"> 
          </div>
          </div>

          <div class="form-group row">
                <label for="email" class="col-6 col-form-label">Email</label>
            <div class="col-12">
               <input type="email" class="form-control" name="email" placeholder="Add Email"> 
           </div>
           </div>

           <div class="form-group row">
                <label for="password" class="col-6 col-form-label">Password</label>
            <div class="col-12">
               <input type="password" class="form-control" name="password" placeholder="Enter Password"> 
           </div>
           </div>

           <div class="form-group row">
                <label for="password1" class="col-6 col-form-label">Password</label>
            <div class="col-12">
               <input type="password" class="form-control" name="password1" placeholder="Enter Password Again"> 
           </div>
           </div>
           <button type="submit" class="btn btn-primary">Submit</button>
        </form>
      </div>
    </div>
    <div class="col-lg-3"></div>
</div>
</div>
      <%- include('../includes/footer'); %>

2 个答案:

答案 0 :(得分:0)

让我们尽量保持最低的技术水平。

假设您正在将HTML表单数据发送到node-js服务器,即您向服务器发出了请求。服务器文件将在请求对象下接收您的请求。现在按逻辑,如果您在服务器文件中控制台记录此请求对象,则应该在其中的某些位置看到表单数据,然后可以将其提取出来,但是哇!你实际上不!

那么,我们的数据在哪里?如果它不仅出现在我的请求中,我们将如何提取它。

对此的简单解释是http以分段形式发送表单数据,目的是在到达目的地时进行组装。那么您将如何提取数据。 使用一种叫做“ body-parser”的东西可以为您做到这一点。

body-parser解析您的请求并将其转换为一种格式,您可以从中轻松提取您可能需要的相关信息。 首先,在您的app.js文件中需要以下内容。

var bodyParser = require('body-parser')

并添加以下行使其生效

app.use(bodyParser.urlencoded({extended: true}));

答案 1 :(得分:0)

简短的回答:尽管您有来自URL的数据,但您无法使用该数据。使用bocy-parser软件包可以解决此问题。

npm install body-parser --save

这将安装body-parser软件包。它的作用是将返回的响应数据绑定在一起,以便您可以实际使用它。没有它,您就只能将数据获取到端点,而无法使用它。

像这样使用正文解析器:

var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({extended: true}));

然后在函数中尝试使用数据的内部做类似的事情

console.log(req.body.username);
console.log(req.body.email);
console.log(req.body.password);
console.log(req.body.password1);

我了解您已经按上述要求尝试执行主体解析器。尝试为此创建一个单独的端点。尝试在单独的/ registeruser端点中执行此操作,而不是/ users / registeruser,查看是否可行。如果有,请重试一下端点设置,否则请进一步评论。