Экспресс-анализатор тела не выполняет синтаксический анализ в запросе промежуточного программного обеспечения нескольких маршрутизаторов

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

Например:

let mymiddleware = (req, res, next) => {
    console.log(req.body); //<- undefined
    next();
}

router.post('/', mymiddleware,
    multer({fileFilter: filefilter,storage:storage}).any(),//<-this file uploader middleware retrieves req.body without problem.
    function (req, res) {
        console.log(req.body); //<- parsed body showing here.
    });

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

(РЕДАКТИРОВАТЬ: подробнее об этой проблеме)

Вот моя настройка body-parser в app.js перед любыми роутерами app.use:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));

function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
    return next();
}
else res.redirect('/');
}

app.use('/console/create_album', ensureAuthenticated, create_album);

и моя форма на передней панели:

<form enctype="multipart/form-data" action='/console/create_album' method='post'>
<!---Just some text inputs, and textarea, file inputs are here -->
</form>

Если я не использую промежуточное ПО mymiddleware на router.post, файлы и данные, проанализированные с помощью основного текста, успешно извлекаются без проблем.


person Baksa Gimm    schedule 07.05.2018    source источник
comment
Покажите, пожалуйста, конфигурацию вашего парсера тела, покажите, где он определен относительно указанного выше маршрута, и покажите, какой тип запроса отправляется. Вероятно, ваш парсер тела не настроен для этого типа данных поста, а multer отвечает за чтение данных тела и их анализ здесь.   -  person jfriend00    schedule 07.05.2018
comment
Привет @ jfriend00 Я обновил свой пост более подробной информацией. Спасибо.   -  person Baksa Gimm    schedule 07.05.2018


Ответы (3)


Вы настроили парсер тела для двух типов данных: json и url-кодирование. Промежуточное программное обеспечение парсера тела будет проверять каждый входящий запрос и делать что-либо с запросом только в том случае, если это один из тех двух типов, для которых вы его настроили.

Но когда вы загружаете файл, это не один из этих двух типов, поэтому анализатор тела не читает и не анализирует его.

С другой стороны, промежуточное программное обеспечение multer() ожидает тип для загрузки файла, поэтому оно читает, анализирует и обрабатывает тело за вас.

К вашему сведению, body-parser doc конкретно говорит следующее:

Это не относится к составным телам из-за их сложной и, как правило, большой природы. Для составных тел вас могут заинтересовать следующие модули:

консьерж и коннектор

многопартийность и многосторонность подключения

грозный

Multer

И ваша форма указывает enctype="multipart/form-data", который является составным.

person jfriend00    schedule 07.05.2018

Вам нужно инициализировать парсер тела. Обратитесь к https://www.npmjs.com/package/body-parser и проверьте из их примера.

РЕДАКТИРОВАТЬ: Multer сохраняет файл на вашем сервере по указанному пути. Затем вам нужно использовать fs для получения файла. Для multer вам нужно отправлять данные в форме 'form-data', а не в кодировке urlencoded или json. Таким образом, бодипарсер не может их обнаружить. Если данные отправляются как urlencoded и json, вы можете настроить bodyparser, как в примере, и получить доступ к req.body.

person Prajval M    schedule 07.05.2018

Измените свой код на:

router.post('/',
    multer({fileFilter: filefilter,storage:storage}).any(),
    mymiddleware,
    function (req, res) {
        console.log(req.body); //<- parsed body showing here.
    });

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

person Sagar    schedule 07.05.2018