req.body не определено или пусто - PullRequest
0 голосов
/ 31 января 2019

У меня два контроллера и два отдельных роутера.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');
}

и это маршруты / 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 голосов
/ 01 февраля 2019

Краткий ответ: хотя у вас есть данные, поступающие в 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);

Я понимаю, что вы уже пытались реализовать парсер тела, как вы сказали выше.Попробуйте сделать отдельную конечную точку для этого.Вместо / users / registeruser попробуйте сделать это в отдельной конечной точке / registeruser и посмотрите, сработает ли это.Если это произойдет, попробуйте еще раз с некоторыми подробностями настройки конечных точек, если нет, прокомментируйте дальше.

0 голосов
/ 31 января 2019

Давайте попробуем сохранить это наименее техническое.

Допустим, вы отправляете данные html-формы на сервер node-js, т.е. вы сделали запрос на сервер.Файл сервера получит ваш запрос под объектом запроса.Теперь по логике, если вы консоль записываете этот объект запроса в файл вашего сервера, вы должны увидеть данные вашей формы где-то в ней, которые затем могут быть извлечены, но оу!Вы на самом деле нет!

Итак, где наши данные?Как мы его извлечем, если он не только присутствует в моем запросе.

Простое объяснение этому - http отправляет данные вашей формы в битах и ​​кусочках, которые предназначены для сборки, когда они достигают места назначения.Так как бы вы извлекли свои данные.Используйте что-то под названием «body-parser», которое сделает это за вас.

body-parser анализирует ваш запрос и преобразует его в формат, из которого вы можете легко извлечь необходимую информацию, которая вам может понадобиться.Прежде всего, в файле app.js требуется следующее.

var bodyParser = require('body-parser')

и добавьте следующую строку, чтобы он работал

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