Сырье тела Expressjs
Как я могу получить доступ к необработанному телу объекта запроса, предоставленному мне expressjs?
var express = require('./node_modules/express');
var app = express.createServer();
app.post('/', function(req, res)
{
console.log(req.body); //says 'undefined'
});
app.listen(80);
Ответы
Ответ 1
По умолчанию express
не буферизует данные, если вы не добавите для этого промежуточное программное обеспечение. Простое решение - следовать примеру в ответе @Stewe ниже, который будет просто конкатенировать все данные самостоятельно. например.
var concat = require('concat-stream');
app.use(function(req, res, next){
req.pipe(concat(function(data){
req.body = data;
next();
}));
});
Недостатком этого является то, что вы теперь переместили весь контент тела POST в ОЗУ как непрерывный фрагмент, который может и не понадобиться. Другой вариант, который стоит рассмотреть, но зависит от того, сколько данных вам нужно обрабатывать в теле сообщения, будет обрабатывать данные как поток вместо этого.
Например, с XML вы можете использовать синтаксический анализатор XML, который поддерживает синтаксический анализ XML, поскольку он входит в виде фрагментов. Одним из таких парсеров будет XML-поток. Вы делаете что-то вроде этого:
var XmlStream = require('xml-stream');
app.post('/', function(req, res) {
req.setEncoding('utf8');
var xml = new XmlStream(req);
xml.on('updateElement: sometag', function(element) {
// DO some processing on the tag
});
xml.on('end', function() {
res.end();
});
});
Ответ 2
Что-то вроде этого должно работать:
var express = require('./node_modules/express');
var app = express.createServer();
app.use (function(req, res, next) {
var data='';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.body = data;
next();
});
});
app.post('/', function(req, res)
{
console.log(req.body);
});
app.listen(80);
Ответ 3
Использование связующего ПО bodyParser.text()
поместит текстовое тело в req.body
.
app.use(bodyParser.text({type: '*/*'}));
Если вы хотите ограничить обработку текстового тела определенными маршрутами или размещать типы контента, вы можете сделать это тоже.
app.use('/routes/to/save/text/body/*', bodyParser.text({type: 'text/plain'})); //this type is actually the default
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
Если вам нужен необработанный Buffer
, вы можете использовать bodyParse.raw()
.
app.use(bodyParser.raw({type: '*/*'}));
Примечание: этот ответ был проверен на узле v0.12.7, экспресс 4.13.2 и парсере тела 1.13.3.
Ответ 4
Поместите следующее промежуточное программное обеспечение перед промежуточным программным обеспечением bodyParser. Он будет собирать необработанные данные тела в request.rawBody и не будет вмешиваться в bodyParser.
app.use(function(req, res, next) {
var data = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
});
app.use(express.bodyParser());
Ответ 5
Итак, кажется, что Express bodyParser анализирует только входящие данные, если для параметра content-type
установлено одно из следующих значений:
-
application/x-www-form-urlencoded
-
application/json
-
multipart/form-data
Во всех остальных случаях он даже не удосуживается прочитать данные.
Вы можете изменить номер строки. 92 of express/ node_modules/connect/lib/middleware/bodyParser.js из
} else {
next();
}
To:
} else {
var data='';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
}
И затем, прочитайте req.rawBody
из своего кода.
Ответ 6
app.use(bodyParser.json({
verify: function (req, res, buf, encoding) {
req.rawBody = buf;
}
}));
app.use(bodyParser.urlencoded({
extended: false,
verify: function (req, res, buf, encoding) {
req.rawBody = buf;
}
}));
Ответ 7
Если у вас возникли проблемы с описанными выше решениями, мешающими обычным почтовым запросам, что-то вроде этого может помочь:
app.use (function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) { req.rawBody += chunk });
});
Дополнительная информация и источник: https://github.com/visionmedia/express/issues/897#issuecomment-3314823
Ответ 8
БУДЬТЕ ОСТОРОЖНЫ с этими другими ответами, поскольку они не будут правильно играть с bodyParser, если вы хотите также поддерживать json, urlencoded и т.д. Чтобы заставить его работать с bodyParser, вы должны заставить обработчика регистрироваться только на Content-Type
заголовок (ы), о котором вы заботитесь, как и сам bodyParser.
Чтобы получить содержимое исходного содержимого запроса с Content-Type: "text/xml"
в req.rawBody
, вы можете сделать:
app.use(function(req, res, next) {
var contentType = req.headers['content-type'] || ''
, mime = contentType.split(';')[0];
if (mime != 'text/xml') {
return next();
}
var data = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
});
Ответ 9
Если вы хотите, чтобы тело было в виде буфера:
var rawParser = function(req, res, next) {
var chunks = [];
req.on('data', function(chunk) {
chunks.push(chunk)
});
req.on('end', function() {
req.body = Buffer.concat(chunks);
next();
});
}
или
var rawParser = bodyParser.raw({type: '*/*'});
а затем:
app.put('/:name', rawParser, function(req, res) {
console.log('isBuffer:', Buffer.isBuffer(req.body));
})
или для всех маршрутов:
app.use(bodyParser.raw({type: '*/*'}));
Ответ 10
Кажется, теперь стало намного проще !
Модуль body-parser теперь может анализировать необработанные и текстовые данные, что делает задачу одной строкой:
app.use(bodyParser.text({type: 'text/plain'}))
ИЛИ ЖЕ
app.use(bodyParser.raw({type: 'application/binary'}))
Обе строки просто заполняют свойство body
, поэтому получите текст с помощью res.body
. bodyParser.text()
выдаст вам строку UTF8, а bodyParser.raw()
предоставит вам необработанные данные.
Это полный код для текстовых/простых данных:
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
app.use(bodyParser.text({type: 'text/plain'}))
app.post('/', function (req, res, next) {
console.log('body:\n' + req.body)
res.json({msg: 'success!'})
next()
})
Смотрите здесь для полной документации: https://www.npmjs.com/package/body-parser
Я использовал Express 4.16 и Body-Parser 1.18