Что делает body-parser с express?


339

Я не понимаю, зачем нам нужно body-parserприложение Express, поскольку мы можем получать данные без использования body-parser. И что это делает на самом деле и как?


54
чтобы читать данные HTTP POST, мы должны использовать модуль узла «body-parser». body-parser - это часть промежуточного программного обеспечения Express, которое читает входные данные формы и сохраняет их как объект javascript, доступный черезreq.body
refactor

2
С помощью Express вы можете читать любые данные внутри HTTP-запроса, такие как заголовки req.headers(массив), вы можете читать тело http-пакета, как req.bodyописано в @CleanCrispCode, и вы можете читать как параметр запроса. req.query.variableЭто помогает, поскольку Express автоматически преобразует запрос в javascript. объекты
Фернандо Цамперин

3
@refactor - это может быть одна из многих причин, по которой мы должны использовать анализатор тела, но он не говорит о том, что он делает, т. е. объекты HTTP-запросов и ответов являются потоками и что они не «читаются» как один объект как res.bodyбез буферизации всего потока в res.bodyпервую очередь.
ортономия

1
В Express версии 4.16+ они включили свою собственную версию body-parser, поэтому вам не нужно загружать этот пакет.
StefanBob

Ответы:


256

Для обработки 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-april-2: в express@4.16.0 промежуточное программное обеспечение анализатора тела в комплекте с express. для более подробной информации см. это


126
Это, пожалуй, самая плохая вещь в истории. Почему разработчикам ядра Express было бы невероятно трудно подключиться новичкам, заставив их установить дополнительное промежуточное ПО для наиболее распространенных случаев использования в веб-разработке?
Elmt

5
@elmt, если вы хотите что-то с мнениями, попробуйте sails.js
Джордж

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

3
Это не lame @elmt, узел предназначен не только для веб-сайтов, его можно использовать для настольных компьютеров, мобильных устройств и т. Д., И в этих случаях он не является обязательным модулем. Node может адаптироваться к вашему приложению без какой-либо ответственности
fnaquira

28
@fnaquira - Ты в замешательстве. Это про экспресс, а не узел.
Elmt

85

Да, мы можем работать без body-parser. Если вы не используете его, вы получаете необработанный запрос, а ваше тело и заголовки не находятся в корневом объекте параметра запроса. Вам придется индивидуально манипулировать всеми полями.

Или вы можете использовать body-parser, так как экспресс-команда поддерживает его.

Что может сделать для вас body-parser: Это упрощает запрос.
Как использовать это: Вот пример:

устанавливать npm install body-parser --save

Вот как использовать body-parser в экспрессе:

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 .

И тогда вы можете получить тело и заголовки в корневом объекте запроса. пример

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-parser проанализирует его, используя одну из четырех стратегий, в зависимости от конкретного промежуточного программного обеспечения, которое вы решили использовать:

  • 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 анализирует ваш запрос и преобразует его в формат, из которого вы можете легко извлечь необходимую информацию.

Например, предположим, у вас есть форма регистрации на вашем веб-интерфейсе. Вы заполняете его и запрашиваете у сервера сохранить данные где-нибудь.

Извлечение имени пользователя и пароля из вашего запроса выполняется так же просто, как показано ниже, если вы используете body-parser.

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

Таким образом, в основном, body-parser проанализировал ваш входящий запрос, собрал куски, содержащие данные вашей формы, затем создал этот объект body для вас и заполнил его данными вашей формы.


10

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

По сути, это промежуточное программное обеспечение для анализа JSON, простого текста или просто возврата необработанного объекта Buffer, с которым вы можете справиться по мере необходимости.


8

Для того, чтобы получить доступ к почтовым данным, мы должны использовать body-parser. По сути, это то body-parser, что позволяет express читать тело, а затем разбирать его на Jsonобъект, который мы можем понять.


7

Это все вопрос удобства.

В принципе, если этот вопрос был «Нам нужно использовать body-parser? Ответ - нет'. Мы можем получить ту же информацию из клиент-пост-запроса, используя более сложный маршрут, который, как правило, будет менее гибким и увеличит объем кода, который мы должны написать, чтобы получить ту же информацию.

Это своего рода такой же , как спрашивать «ли нам нужно использовать , expressчтобы начать?» Опять же, ответа нет, и опять же, на самом деле все сводится к тому, чтобы избавить нас от необходимости писать больше кода для выполнения основных задач, которые выражаются в «встроенном».

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


6

Понимание тела запросов

При получении запроса POST или PUT тело запроса может иметь важное значение для вашего приложения. Получение данных тела немного сложнее, чем доступ к заголовкам запросов. Объект запроса, который передается обработчику, реализует интерфейс ReadableStream. Этот поток можно прослушивать или передавать в другом месте, как и любой другой поток. Мы можем получить данные прямо из потока, прослушивая события «data» и «end» потока.

Кусок, генерируемый в каждом событии «data», является буфером. Если вы знаете, что это будут строковые данные, то лучше всего собрать данные в массив, а затем в конце «конкатенировать» и структурировать.

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
});

Понимание body-parser

Согласно его документации

Анализируйте входящие тела запросов в промежуточном программном обеспечении перед вашими обработчиками, доступными в свойстве req.body.

Как вы видели в первом примере, нам пришлось вручную анализировать поток входящих запросов, чтобы извлечь тело. Это становится утомительным, когда есть несколько данных формы разных типов. Поэтому мы используем пакет body-parser, который выполняет всю эту задачу под капотом.

Он предоставляет четыре модуля для анализа различных типов данных.

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.