Сырье тела 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); 

По умолчанию express не выполняет буферизацию данных, если вы не добавите промежуточное ПО для этого. Простое решение заключается в следующем примере в ответе @ Stewe ниже, который будет просто конкатенировать все данные самостоятельно. например

 var concat = require('concat-stream'); app.use(function(req, res, next){ req.pipe(concat(function(data){ req.body = data; next(); })); }); 

Недостатком этого является то, что вы теперь переместили весь контент тела POST в ОЗУ как непрерывный fragment, который может и не понадобиться. Другой вариант, который стоит рассмотреть, но зависит от того, сколько данных вам нужно обработать в теле сообщения, будет обрабатывать данные как stream вместо этого.

Например, с XML вы можете использовать синтаксический анализатор XML, который поддерживает синтаксический анализ XML, поскольку он входит в виде кусков. Одним из таких парсеров будет XML Stream . Вы делаете что-то вроде этого:

 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(); }); }); 

Что-то вроде этого должно работать:

 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); 

Поместите следующее промежуточное программное обеспечение перед промежуточным программным обеспечением 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()); 

Использование промежуточного программного обеспечения 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, express 4.13.2 и body-parser 1.13.3.

Таким образом, похоже, что BodyPorter Express только анализирует входящие данные, если для content-type задано одно из следующих значений:

  1. application/x-www-form-urlencoded
  2. application/json
  3. multipart/form-data

Во всех других случаях он даже не утруждает себя чтению данных.

Вы можете изменить номер строки. 92 из express / node_modules / connect / lib / middleware / bodyParser.js из

 } else { next(); } 

Для того, чтобы:

 } else { var data=''; req.setEncoding('utf8'); req.on('data', function(chunk) { data += chunk; }); req.on('end', function() { req.rawBody = data; next(); }); } 

И затем, прочитайте req.rawBody из вашего кода.

Если у вас возникли проблемы с описанными выше решениями, мешающими обычным почтовым запросам, что-то вроде этого может помочь:

 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

 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; } })); 

Если вы хотите, чтобы тело было буфером:

 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: '*/*'})); 

Будьте осторожны с этими другими ответами, поскольку они не будут правильно играть с bodyParser, если вы хотите также поддерживать json, urlencoded и т. Д. Чтобы заставить его работать с bodyParser, вы должны заставить обработчик регистрироваться только в заголовке Content-Type ( s), о котором вы заботитесь, как и сам 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(); }); }); 

Кажется, теперь это стало намного проще !

Модуль 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

Я использовал выражение 4.16 и body-parser 1.18

  • Как установить тайм-аут Keep-Alive HTTP на сервере nodejs
  • Хотя цикл с обещаниями
  • nodejs требуется внутри файла TypeScript
  • Node.js - SyntaxError: Неожиданный импорт токена
  • Ошибка Node.JS: ENOSPC
  • Как устранить ошибку «Не удается найти модуль» с помощью Node.js?
  • Android-шлюз, подписанный якорем HTTPS, для пути сертификации не найден
  • Как включить скрипты, расположенные внутри папки node_modules?
  • Browserify - вызов функции, связанной с файлом, созданным с помощью браузера в браузере
  • ExpressJS: как перенаправить запрос POST с параметрами
  • Как удалить модули npm в узле js?
  • Давайте будем гением компьютера.