req.body возвращается пустым в node.js и в экспресс-приложении - PullRequest
0 голосов
/ 16 января 2019

Я изучаю node.js с экспрессом. Я довольно новичок, и это мой первый проект без каких-либо учебных пособий.

Приложение будет использовать ejs для шаблонов, а я использую express.json () для анализа данных из формы. Не использует body-parser, так как express теперь делает это из коробки.

Всякий раз, когда я console.log (req.body), он появляется как пустая строка. Когда я пытаюсь указать console.log (req.body.name) или любое другое поле формы, оно возвращается как неопределенное.

Пожалуйста, помогите, я понятия не имею, в чем проблема, и это никогда не было проблемой ни с одним из моих предыдущих приложений практики.

Вот мой соответствующий код:

в app.js

// Require routes
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
//
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('/', indexRouter);
app.use('/users', usersRouter);

В моей форме (register.ejs):

<form action="/users/register" method="POST">
    <div class="formGroup">
        <label for="name">Name</label>
        <input type="text" name="name" placeholder="Full name">
    </div>
    <div class="formGroup">
        <label for="username">Username</label>
        <input type="text" name="username" placeholder="Enter any username">
    </div>
    <div class="formGroup">
        <label for="email">Email</label>
        <input type="email" name="email" placeholder="Enter your email">
    </div>
    <div class="formGroup">
        <label for="password">Password</label>
        <input type="password" name="password">
    </div>
    <div class="formGroup">
        <label for="password2">Confirm password</label>
        <input type="password" name="password2">
    </div>
    <div class="formGroup">
        <label for="about">About</label>
        <textarea name="about" placeholder="Say a little bit about yourself..."></textarea>
    </div>
    <div class="formGroup">
        <input type="submit" name="submit" value="Submit">
    </div>
</form>

В моем файле маршрута (users.js)

router.post('/register', (req, res, next) => {

  console.log(req.body);

  const newUser = {
    name: req.body.name,
    username: req.body.username,
    email: req.body.email,
    password: req.body.password,
    about: req.body.about
  }
  console.log(newUser);
  res.redirect('/users');
});

Спасибо за любой ответ!

Ответы [ 3 ]

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

ХОРОШО! Это раздражительно. Я просто перезапустил свой сервер, и он работал. Я не знаю, почему это не сработало раньше. Я думаю, что это может быть потому, что я думал, что я использовал nodemon, когда я не был. Хорошо, что я показал, насколько я нуб, с моим первым постом, ха-ха.

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

Добро пожаловать на фронт, Я видел ваш код, и, возможно, вам пришлось обратить внимание на некоторые ошибки.

Вы должны установить bodyParser npm install body-parser --save

`// Require routes
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
//
app.use(logger('dev'));
app.use(express.json());

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// 
app.use('/', indexRouter);
app.use('/users', usersRouter);`

И в форме (в файле register.ejs) используется action="/users/register", поэтому вы должны включить маршрут /users в ваш файл users.js, потому что маршрут в post('/register' ... должен совпадать с action="/users/register".

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

Вам нужно промежуточное программное обеспечение для анализа тела запроса. Я думаю, что наиболее распространенным является body-parser . Это довольно легко использовать:

  • Установите его с помощью: npm install body-parser
  • Импортируйте это: var bodyParser = require('body-parser')
  • И зарегистрируйтесь в качестве промежуточного программного обеспечения: app.use(bodyParser.json({ type: 'application/*+json' }))
...