Анализатор тела не определен, req.body - PullRequest
0 голосов
/ 02 ноября 2018

Итак, у меня есть этот пост, чтобы добавить некоторые продукты в мой MongoDB

router.post('/addprod',mid.reqAdmin,function(req,res,next){
            if(req.body.category && req.body.name && req.body.price && req.body.description && req.files)
            {
                upload(req,res,function(err) {
                    console.log("req.body"); //form fields
                    console.log(req.body);
                    console.log("req.file");
                    console.log(req.files); //form files
                })
                var prodData={
                    name: req.body.name,
                    price: req.body.price,
                    description: req.body.description,
                    category: req.body.category,    
                    images: req.files.filename
                };
                console.log(prodData);
                Prod.create(prodData,function (error, product) {
                    if (error) {
                        req.flash('error','Error');
                        return res.redirect('/addprod');
                    } 
                    else{
                        req.flash('success', 'Success');
                        return res.redirect('/addprod');
                    }
                });         
            }else
            {
                req.flash('error','All Fields Required');
                return res.redirect('/addprod');
            }
        });

И у меня есть этот шаблон (мопс / нефрит):

.form
        form(enctype="multipart/form-data" action='/addprod' method='POST')
            input(type="text"  id='category' placeholder="Category name='category')
            input(type="text"  id='name' placeholder="Name" name='name')
            input(type="text"  id='price' placeholder="Price" name='price')
            input(type="text"  id='description' placeholder="Description" name='description')
            input(type="file" name="images" multiple)
            button(type="submit") Add

Поэтому, когда я нажимаю кнопку «Добавить» со всеми заполненными полями, я получаю «Все поля обязательны для заполнения» я поставил несколько консольных журналов перед оператором IF и получаю req.body.name = undefined и req.body = {}. И я не знаю, почему я это понимаю. В файле app.js у меня есть парсер тела. Я имею в виду на каждом маршруте, но этот парсер тела работает.

1 Ответ

0 голосов
/ 02 ноября 2018

body-parser не обрабатывает multipart/form-data. Для этого вам понадобится multer / грозный или аналогичный пакет npm.

Пример с express-formidable :

где-то в экспресс-конфигурации

// ...

const formidableMiddleware = require('express-formidable');

//...

app.use(formidableMiddleware({
  encoding: 'utf-8',
  multiples: true
});

// ...

Затем в вашем файле контроллера вы можете использовать req.fields для доступа к текстовым полям (например, category, name) и req.files для доступа к двоичным данным (например, images)

Пример

router.post('/addprod', mid.reqAdmin, function(req, res, next) {
    if(req.fields.category &&
       req.fields.name &&
       req.fields.price &&
       req.fields.description &&
       req.files) {
      // ...
    } else {
      // ...
    }
});
...