Экспресс-анализатор тела не анализируется в запросе промежуточного ПО для нескольких маршрутизаторов - PullRequest
0 голосов
/ 07 мая 2018

Я хочу получить доступ к 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 не анализирует, когда используется несколько промежуточных программ? (Да, я считаю, что правильно настроил свой анализатор тела, поскольку он работает в обработчиках)

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

Вот мои настройки парсера тела в 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.

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

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

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

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

0 голосов
/ 07 мая 2018

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

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

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

К вашему сведению, документ body-parser специально говорит это:

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

Busboy и Connect-Busboy

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

грозным

multer

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

0 голосов
/ 07 мая 2018

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

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

...