Коли я використовую Express, і мій код:
app.use(express.bodyParser());
Як я отримаю тіло необробленого запиту ?
Відповіді:
Редагування 2: Випуск 1.15.2 модуля парсера тіла вводить режим raw , який повертає тіло як буфер . За замовчуванням він також автоматично обробляє дефляцію та декомпресію 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, де проміжне програмне забезпечення все ще було в комплекті з фреймворком. Сучасним еквівалентом є модуль парсеру тіла , який повинен бути встановлений окремо.
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());
Використовуйте парсер тіла Проаналізуйте тіло за тим, яким воно буде:
app.use(bodyParser.text());
app.use(bodyParser.urlencoded());
app.use(bodyParser.raw());
app.use(bodyParser.json());
тобто Якщо ви повинні отримати необроблений текстовий файл, запустіть .text()
.
Ось що в даний час підтримує парсер тіла