Що робить аналізатор тіла з експресом?


339

Я не розумію, навіщо нам це потрібно body-parserв програмі Express, оскільки ми можемо отримувати дані без використання body-parser. А що це робить насправді і як?


54
для того, щоб зчитувати дані HTTP POST, ми повинні використовувати модуль вузла "тіло-парсер". body-parser - це фрагмент експрес-проміжного програмного забезпечення, який читає введення форми та зберігає її як об’єкт JavaScript, доступний черезreq.body
refactor

2
За допомогою експресу ви можете читати будь-які дані всередині HTTP-запиту, наприклад заголовки req.headers(масив), ви можете читати тіло http-пакету, як req.bodyпояснено @CleanCrispCode, і ви можете читати як параметр запиту. req.query.variableЦе допомагає, оскільки express автоматично перетворює запит у javascript об'єкти
Фернандо Замперін

3
@refactor - це може бути однією з багатьох причин, за якими ми маємо використовувати аналізатор тіла, але він не говорить про те, що це робить, тобто те, що HTTP-запити та відповіді є потоками, і що вони не "читаються" як єдиний об'єкт як, res.bodyбез того, щоб весь потік був завантажений res.bodyпершим.
ортономія

1
З експрес-версією 4.16+ вони включили власну вбудовану версію тесту-аналізатора, тому вам не доведеться втягувати цей пакет.
Стефан Боб

Відповіді:


255

Для обробки HTTP POSTзапиту в Express.js версії 4 і вище вам потрібно встановити модуль середнього програмного забезпечення, який називається body-parser.

body-parserвитягнути всю частину тіла потоку вхідного запиту та виставити його на req.body.

Посереднє програмне забезпечення було частиною Express.js раніше, але тепер його потрібно встановити окремо.

Цей body-parserмодуль розбирає кодовані JSON, буфер, рядки та URL-адреси, подані за допомогою HTTP POSTзапиту. Встановіть body-parserза допомогою NPM, як показано нижче.

npm install body-parser --save

редагувати у 2019-му квітня-2: у express@4.16.0 проміжне програмне забезпечення body-parser у комплекті з експресом. Детальніше див. у цьому


126
Це цілком можливо найпізніша річ. Чому б Express Core Devs зробив надзвичайно важким для новачків увійти на борт, змусивши їх встановлювати додаткові проміжні програми для найбільш поширених випадків використання в веб-розробці?
elmt

5
@elmt, якщо ви хочете щось із думками, спробуйте sails.js
Джордж

1
@ user1063287 так, це так. urlencoded()і json()насправді фабрики середнього програмного забезпечення, які повертають функцію проміжного програмного забезпечення, яка викликаєnext()
Нік Меннінг

3
Це не кульгавий @elmt, вузол не тільки для Інтернету, його можна використовувати на робочому столі, мобільному пристрої тощо, і в цих випадках це не обов'язковий модуль. Вузол може адаптуватися до вашої заявки без будь-якої відповідальності
fnaquira

28
@fnaquira - Ви розгублені. Мова про експрес-не вузол.
elmt

85

Так, ми можемо працювати без body-parser. Якщо ви не використовуєте, ви отримуєте необроблений запит, а ваше тіло та заголовки не знаходяться в кореневому об'єкті параметра запиту. Вам доведеться індивідуально маніпулювати усіма полями.

Або ви можете використовувати body-parser, оскільки експрес-команда підтримує його.

Що може зробити для вас аналізатор тіла: Це спрощує запит.
Як ним користуватися: Ось приклад:

Встановити npm install body-parser --save

Це, як використовувати body-аналізатор у експресі:

const express = require('express'),
      app = express(),
      bodyParser = require('body-parser');

// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

Посилання

https://github.com/expressjs/body-parser .

І тоді ви можете отримати тіло та заголовки в об’єкт запиту root. Приклад

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})

3
Ей, дякую за інформацію, чи можете ви розмістити приклад коду без аналізатора тіла?
Ільяс Карім

55

Відповідь тут пояснюють це дуже детально і блискуче, відповідь містить:

Коротко; body-parser витягує всю частину тіла потоку вхідного запиту і виставляє його на req.bodyщось простіше в інтерфейсі. Вам вона сама по собі не потрібна, тому що ви могли все це зробити самі. Однак це, швидше за все, зробить те, що ви хочете, і позбавить вас від неприємностей.


Піти трохи більше в глибину; body-parser надає вам проміжне програмне забезпечення, яке використовує nodejs / zlib для розпакування даних вхідних запитів, якщо вони застебнуті та stream-utils / raw-body, щоб очікувати повного, необробленого вмісту тіла запиту перед "розбором його" (це означає, що якщо ви не збиралися використовувати тіло запиту, ви лише витратили час.

Маючи сирий вміст, body-аналізатор розбере його за допомогою однієї з чотирьох стратегій, залежно від конкретного проміжного програмного забезпечення, яке ви вирішили використовувати:

  • bodyParser.raw () : на самому ділі не розібрати тіло, а просто виставляє буферізованние вгору вміст з перш у буфері на req.body.

  • bodyParser.text () : читає буфер як звичайний текст і виставляє отриманий рядок на req.body.

  • bodyParser.urlencoded () : аналізує текст як закодовані URL-адресою (саме так браузери прагнуть надсилати дані форми із звичайних форм, встановлених на POST), і відкриває отриманий об'єкт (містить ключі та значення) на req.body. Для порівняння; в PHP все це робиться автоматично і виставляється в $_POST.

  • bodyParser.json () : аналізує текст як JSON і виставляє отриманий об'єкт на req.body.

Тільки після встановлення req.bodyпотрібного вмісту він зателефонує до наступного проміжного програмного забезпечення в стеку, який потім зможе отримати доступ до даних запиту, не замислюючись про те, як розпакувати та розібрати його.

Ви можете звернутися до body-parser github, щоб прочитати їх документацію, вона містить інформацію щодо його роботи.


47

Спробуємо дотримати цю найменш технічну.

Скажімо, ви надсилаєте дані форми HTML на сервер node-js, тобто ви зробили запит на сервер. Файл сервера отримає ваш запит під об’єктом запиту. Тепер за логікою, якщо ви консоліруєте цей об'єкт запиту у вашому файлі сервера, ви повинні побачити свої форми форми десь у ньому, які потім можна було б витягти, але ось хто! ти насправді ні!

Отже, де наші дані? Як ми будемо його витягувати, якщо його не тільки в моєму запиті.

Просте пояснення цього полягає в тому, що http надсилає ваші форми форми в шматочках і шматочках, які мають бути зібрані по мірі їх досягнення. То як би ви витягли свої дані.

Але чому б це сприйняти щоразу вручну, аналізуючи ваші дані за шматки і збираючи їх. Використовуйте щось, що називається «аналізатор тіла», що зробить це для вас.

body-parser аналізує ваш запит і перетворює його у формат, з якого ви можете легко отримати відповідну інформацію, яка вам може знадобитися.

Наприклад, припустімо, що у вас на кордоні форма реєстрації. Ви заповнюєте його і просите сервер десь зберегти дані.

Вилучення імені користувача та пароля з вашого запиту відбувається так само просто, як нижче, якщо ви використовуєте body-parser.

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};

Таким чином, аналізатор тіла проаналізував ваш вхідний запит, зібрав шматки, що містять ваші дані форми, потім створив для вас цей об’єкт тіла і заповнив його вашими даними форми.


10

Він аналізує тіло запиту HTTP. Зазвичай це необхідно, коли вам потрібно знати більше, ніж просто URL-адресу, яку ви звертаєте, зокрема в контексті запиту HTTP POST або PUT PATCH, де потрібна інформація міститься в тілі.

В основному це проміжне програмне забезпечення для розбору JSON, простого тексту або просто повернення необмеженого буферного об'єкта, з яким ви можете мати справу, як вам потрібно.


8

Для отримання доступу до даних публікації ми повинні використовувати body-parser. В основному те, що body-parserтаке, що дозволяє експресу читати тіло, а потім розбирати його на Jsonоб'єкт, який ми можемо зрозуміти.


7

Це все питання зручності.

В основному, якщо питання було "Чи потрібно нам користуватися body-parser?" Відповідь - «Ні». Ми можемо придумати ту саму інформацію від клієнта-після запиту, використовуючи більш схематичний маршрут, який, як правило, буде менш гнучким і збільшить кількість коду, який ми повинні написати, щоб отримати ту саму інформацію.

Це на зразок того, що запитувати "Чи потрібно нам використовувати expressдля початку?" Знову ж таки, відповіді немає: і знову ж таки, насправді все зводиться до того, щоб врятувати нам клопоту написати більше коду, щоб виконати основні речі, які виражають, поставлені із "вбудованим".

На поверхні - body-parserполегшує доступ до інформації, що міститься в запитах клієнтів, у різних форматах, а не для того, щоб ви захоплювали необроблені потоки даних і з'ясовували, у якому форматі інформація знаходиться, набагато менше вручну аналізуючи цю інформацію на корисні дані.


6

Розуміння запитів Орган

Отримуючи запит POST або PUT, орган запиту може бути важливим для вашої програми. Отримання даних про тіло пов'язане трохи більше, ніж доступ до заголовків запитів. Об'єкт запиту, який передається обробнику, реалізує інтерфейс ReadableStream. Цей потік можна прослухати або передати в іншому місці, як і будь-який інший потік. Ми можемо захоплювати дані прямо з потоку, слухаючи події "дані" та "кінець" потоку.

Частина, що випромінюється в кожній події "даних", є буфером. Якщо ви знаєте, що це будуть рядкові дані, найкраще зробити це зібрати дані в масив, а потім на кінці об'єднати і порядок їх.

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

Розуміння аналізатора тіла

Відповідно до його документації

Проаналізуйте органи вхідного запиту в середньому програмному забезпеченні перед вашими обробниками, доступними у власності req.body.

Як ви бачили в першому прикладі, нам потрібно було вручну проаналізувати потік запиту, щоб витягти тіло. Це стає стомлюючим, коли є кілька даних різних форм. Тому ми використовуємо пакет body-parser, який виконує все це під кришкою.

Він надає чотири модулі для аналізу різних типів даних

Після того, як тіло-синтаксичний аналізатор вмісту сировини використовуватиме одну з перерахованих вище стратегій (залежно від проміжного програмного забезпечення, яке ви вирішили використовувати) для аналізу даних. Більше про них можна прочитати, прочитавши їх документацію.

Після встановлення req.bodyтесту до аналізу, тіло-аналізатор буде викликати next()виклик наступного середнього програмного забезпечення в стек, який потім може отримати доступ до даних запиту, не замислюючись про те, як розпакувати та розібрати його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.