Форма POST-запросов Тело пусто - Node.js / express / ejs / body-parser - PullRequest
0 голосов
/ 20 сентября 2018

У меня проблемы с моим постом из регистрационной формы в node.js.Каждый раз, когда форма публикуется, тело запроса содержит информацию, но тело пусто.Я новичок в ноде и выражаюсь, так что это, вероятно, что-то маленькое, но я не могу понять, насколько я понимаю.

Вот моя форма в ejs:

<form class="form-signin" method="post" action="/users/register">
  <div class="form-group">
    <label class="sr-only" for="email">Email address</label>
    <input type="email" class="form-control" id="email" placeholder="Enter Email" autocomplete="off">
  </div>
  <div class="form-group">
    <label class="sr-only" for="password">Password</label>
    <input type="password" class="form-control" id="password" placeholder="Enter Password">
  </div>
  <div class="form-group">
    <label class="sr-only" for="confirmPassword">Confirm Password</label>
    <input type="password" class="form-control" id="confirmPassword" placeholder="Re-enter Password">
  </div>
  <button class="btn btn-dark mt-3" type="submit">Submit</button>
</form>

Здесьмой код маршрутизатора в пользовательском маршрутизаторе:

router.post('/register', function(request, response, next) {
  console.log(request);
  console.log(request.body)
  response.render('register', { 'title': 'Register' });
});

Вот соответствующий вывод на консоли:

console.log(request); output shortened this is just the tail.      
  _startAt: [ 299545, 483820242 ],
  _startTime: 2018-09-20T16:08:59.366Z,
  _remoteAddress: '::1',
  body: {},
  _body: true,
  length: undefined,
  read: [Function],
  secret: undefined,
  cookies: {},
  signedCookies: {},
  route:
   Route {
     path: '/register',
     stack: [ [Object] ],
     methods: { post: true } } }
{}
POST /users/register 200 21.906 ms - 2361

код app.js:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var bodyParser = require('body-parser');

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

var app = express();

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(express.static(path.join(__dirname, 'public')));

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

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

app.use(function(request, response, next) {
  next(createError(404));
});

app.use(function(error, request, response, next) {
  response.locals.message = error.message;
  response.locals.error = request.app.get('env') === 'development' ? error : {};
  response.status(error.status || 500);
  response.render('error');
});

module.exports = app;

ВещиЯ пробовал:

  • разные браузеры
  • разные маршруты
  • написание простых форм с нуля
  • грозных вместо анализатора тела

На данный момент я почти уверен, что это проблема с формой ejs, потому что объект body в запросе всегда пуст.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

В другом ответе было указано, что вам не хватает, и я обновил ваш код .ejs, чтобы показать вам правильный способ размещения html-формы:

<form class="form-signin" method="post" action="/users/register">
  <div class="form-group">
    <label class="sr-only" for="email">Email address</label>
    <input type="email" name="email" class="form-control" id="email" placeholder="Enter Email" autocomplete="off">
  </div>
  <div class="form-group">
    <label class="sr-only" for="password">Password</label>
    <input type="password" name="password" class="form-control" id="password" placeholder="Enter Password">
  </div>
  <div class="form-group">
    <label class="sr-only" for="confirmPassword">Confirm Password</label>
    <input type="password" name="confirmPassword" class="form-control" id="confirmPassword" placeholder="Re-enter Password">
  </div>
  <button class="btn btn-dark mt-3" type="submit">Submit</button>
</form>

Вы можете выполнить вышеизложенное или обработать отправку.с javascript / jquery, если вы отправляете более сложную форму или вам нужна какая-то проверка на полях.

См. этот ответ: Отправьте форму с помощью jQuery

0 голосов
/ 07 февраля 2019

Еще одна распространенная ошибка при использовании Express, убедитесь, что вы используете boyParser i.e

const router = express();
const bodyParser = require('body-parser');

router.use(bodyParser.json())
.use(bodyParser.urlencoded({
    extended: true
}));
0 голосов
/ 20 сентября 2018

Для элементов <input> в форме должен быть определен атрибут name, а не только id.

...