Ответ 1
Редактировать 2: В выпуске 1.15.2 модуля синтаксического анализатора представлен raw mode, который возвращает тело как a Buffer. По умолчанию он также автоматически обрабатывает дефляцию дефляции и gzip. Пример использования:
var bodyParser = require('body-parser');
app.use(bodyParser.raw(options));
app.get(path, function(req, res) {
// req.body is a Buffer object
});
По умолчанию объект options
имеет следующие параметры по умолчанию:
var options = {
inflate: true,
limit: '100kb',
type: 'application/octet-stream'
};
Если вы хотите, чтобы ваш сырой парсер разбирал другие типы MIME, отличные от application/octet-stream
, вам нужно будет изменить его здесь. Он также поддерживает подстановочные знаки, такие как */*
или */application
.
Примечание. Следующий ответ предназначен для версий до Express 4, где промежуточное программное обеспечение все еще связано с каркасом. Современный эквивалент - это модуль body-parser, который необходимо установить отдельно.
Свойство rawBody
в Express было когда-то доступно, но было удалено с версии 1.5.1. Чтобы получить необработанное тело запроса, перед использованием bodyParser вы должны установить промежуточное программное обеспечение. Вы также можете прочитать обсуждение GitHub об этом здесь.
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function() {
next();
});
});
app.use(express.bodyParser());
Это промежуточное программное обеспечение будет считываться из фактического потока данных и хранить его в свойстве rawBody
запроса. Затем вы можете получить доступ к необработанному телу следующим образом:
app.post('/', function(req, res) {
// do something with req.rawBody
// use req.body for the parsed body
});
Изменить: Кажется, что этот метод и bodyParser отказываются сосуществовать, потому что один будет потреблять поток запросов перед другим, что приведет к тому, что один из них второй, чтобы никогда не запускать end
, поэтому никогда не вызывал next()
и висит ваше приложение.
Простейшим решением, скорее всего, будет изменение источника bodyParser, который вы найдете в строке 57 анализатора JSON. Это будет выглядеть модифицированная версия.
var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function() {
req.rawBody = buf;
var first = buf.trim()[0];
...
});
Вы найдете файл в этом месте:
/node_modules/express/node_modules/connect/lib/middleware/json.js
.