Node.js (с express & bodyParser): невозможно получить данные формы из почтового запроса

Я не могу восстановить данные формы почтового запроса, отправленного на мой сервер Node.js. Я поместил ниже код сервера и почтовый запрос (отправленный почтальоном в chrome):

Разместить запрос

POST /api/login HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="userName"

jem
----WebKitFormBoundaryE19zNvXGzXaLvS5C

Код сервера NodeJS

var express    = require('express');        // call express
var app        = express();                 // define our app using express
var bodyParser = require('body-parser');

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

app.all('/*', function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Content-Type,accept,access_token,X-Requested-With');
    next();
});

var port = process.env.PORT || 8080;        // set our port

var router = express.Router();              // get an instance of the express Router

router.get('/', function(req, res) {

    res.json({ message: 'I am groot!' });   
});

// Login
router.route('/login')

    .post(function(req, res){

        console.log('Auth request recieved');

        // Get the user name
        var user = req.body.userName;

        var aToken = getToken(user);

        res.json({

            'token':'a_token'
        });
    });

app.use('/api', router);

app.listen(port);

Метод входа в систему пытается получить req.body.userName, тем не мение, req.body всегда пусто Я видел другие случаи, когда SO описывал такое поведение, но ни один из связанных ответов здесь не подходил.

Спасибо за помощь.

7 ответов

Решение

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

[EDITED]

  1. Если вам требуется анализ данных формы, закодированных по URL-адресу (не составных), а также JSON, попробуйте добавить:

    // Put this statement near the top of your module
    var bodyParser = require('body-parser');
    
    
    // Put these statements before you define any routes.
    app.use(bodyParser.urlencoded());
    app.use(bodyParser.json());
    

    Во-первых, вам нужно добавить body-parser к dependencies собственность вашего package.json, а затем выполнить npm update,

  2. Для обработки данных формы, состоящей из нескольких частей, bodyParser.urlencoded() анализатор тела не будет работать. Смотрите предлагаемые модули для разбора составных частей.

Я следил за этим https://www.tutorialspoint.com/expressjs/expressjs_form_data.htm

var bodyParser = require('body-parser');
var multer = require('multer');
var forms = multer();

// apply them

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

// how to use

router.post('/', function(req, res) {
    console.log(req.body);
    console.log('received the widget request');
});

Для обработки запроса multipart/form-data, поддерживающего загрузку файла, вам необходимо использовать модуль multer. ссылка npm для промежуточного программного обеспечения Multer

  • Для Json: используйте body-parser.
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))

(вы также должны отправить Content-Type: application/json в заголовке запроса)

  • Для нормальной формы или составной формы (формы с файлами) используйте body-parser + multer.
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use(multer().array())

(Вы НЕ должны отправлять Content-Type: application/jsonв этом случае. вы не должны ничего отправлять, илиContent-Type: multipart/form-data если у вас есть файлы в форме.

  • в почтальоне вы не должны отправлять Content-Type: multipart/form-dataвручную. иначе вы получите ошибку (Boundary not found). (он добавит это автоматически.))

Убедитесь, что вы поставили в следующем порядке: bodyParser.json(). app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true }));

Убедитесь, что вы не используете enctype как multipart/form-data, парсер тела не поддерживает его. используйте строку ниже, прежде чем определять какой-либо маршрут.

app.use (bodyParser.urlencoded()); app.use (bodyParser.json());

Я понял, что в моем случае я не использовал атрибут «имя» с тегами ввода HTML. Я исправил это, изменив:

Этот

      <input id="first_name" />

К

      <input id="first_name" name="first_name" />
Другие вопросы по тегам