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]
Если вам требуется анализ данных формы, закодированных по 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
,Для обработки данных формы, состоящей из нескольких частей,
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" />