Когда я использую Express, и мой код:
app.use(express.bodyParser());
Как мне получить необработанное тело запроса ?
Ответы:
Редактировать 2: Версия 1.15.2 модуля парсера тела вводит необработанный режим , который возвращает тело как буфер . По умолчанию он также автоматически выполняет распаковку deflate и 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
Недвижимость Экспресс когда - то была доступна, но удалены , начиная с версии 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 Connect. Так будет выглядеть модифицированная версия.
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
.
У меня есть решение, которое отлично сочетается с bodyParser, используя verify
обратный вызов в bodyParser. В этом коде я использую его, чтобы получить sha1 контента, а также необработанное тело.
app.use(bodyParser.json({
verify: function(req, res, buf, encoding) {
// sha1 content
var hash = crypto.createHash('sha1');
hash.update(buf);
req.hasha = hash.digest('hex');
console.log("hash", req.hasha);
// get rawBody
req.rawBody = buf.toString();
console.log("rawBody", req.rawBody);
}
}));
Я новичок в Node.js и express.js (начался буквально вчера!), Поэтому мне хотелось бы услышать комментарии по этому решению.
req.rawBody = buf.toString();
и убрал остальное из verify
функции, потому что это было все, что мне было нужно, и это прекрасно работало. Не нужно менять исходный код bodyParser!
req.rawBody = buf.toString(encoding);
application/json
запросы
Это решение сработало для меня:
var rawBodySaver = function (req, res, buf, encoding) {
if (buf && buf.length) {
req.rawBody = buf.toString(encoding || 'utf8');
}
}
app.use(bodyParser.json({ verify: rawBodySaver }));
app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
app.use(bodyParser.raw({ verify: rawBodySaver, type: '*/*' }));
Когда я использую решение, req.on('data', function(chunk) { });
оно не работает с фрагментированным телом запроса.
БУДЬТЕ ОСТОРОЖНЫ с этими другими ответами, поскольку они не будут правильно работать с bodyParser, если вы хотите также поддерживать json, urlencoded и т. Д. Чтобы заставить его работать с bodyParser, вы должны настроить свой обработчик так, чтобы он регистрировался только в Content-Type
заголовках, которые вы заботиться, как и сам bodyParser.
Для того, чтобы получить сырье содержания тела запроса с Content-Type: "text/plain"
в req.rawBody
вы можете сделать:
app.use(function(req, res, next) {
var contentType = req.headers['content-type'] || ''
, mime = contentType.split(';')[0];
if (mime != 'text/plain') {
return next();
}
var data = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
});
app.use(bodyParser.urlencoded({limit: '80mb', extended: true})); app.use(bodyParser.json({limit: '80mb'})); app.use(bodyParser.raw({type: 'application/octet-stream'}))
Это тоже подойдет.
Это вариант ответа на гексацианид выше. Это промежуточное ПО также обрабатывает событие data, но не ожидает, пока данные будут использованы, перед вызовом next. Таким образом, промежуточное программное обеспечение и bodyParser могут сосуществовать, параллельно потребляя поток.
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
next();
});
app.use(express.bodyParser());
Используйте body-parser. Разберите тело таким, каким оно будет:
app.use(bodyParser.text());
app.use(bodyParser.urlencoded());
app.use(bodyParser.raw());
app.use(bodyParser.json());
т.е. Если вы хотите получить необработанный текстовый файл, запустите .text()
.
Это то, что сейчас поддерживает body-parser