Подтвердить что ты не робот

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

Ответ 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