Коли я використовую 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().
Ось що в даний час підтримує парсер тіла