Req.body не повторяется в node.js - PullRequest
0 голосов
/ 04 сентября 2018

Я создаю макет restful API для лучшего изучения Я использую MongoDB и node.js, а для тестирования я использую почтальон.

У меня есть маршрутизатор, который отправляет запрос на обновление router.patch. В моей БД у меня есть name (строка), price (число) и imageProduct (строка - я держу путь к изображению).

Я могу обновить свои name и price объекты, используя raw-format на почтальоне, но я не могу обновить его с помощью form-data . Как я понимаю, в raw-form я обновляю данные, используя формат массива. Есть ли способ сделать это в form-data ? Цель использования form-data , я хочу загрузить новое изображение, потому что я могу обновить путь к productImage, но я не могу загрузить общедоступную папку нового изображения. Как я могу справиться с этим?

Пример обновления данных в необработанном виде

[ {"propName": "name"}, {"value": "test"}]

router.patch

router.patch('/:productId', checkAuth, (req, res, next) => {
const id = req.params.productId;

const updateOps = {};

for (const ops of req.body) {
    updateOps[ops.propName] = ops.value;
}
Product.updateMany({_id: id}, {$set: updateOps})
    .exec()
    .then(result => {
        res.status(200).json({
            message: 'Product Updated',
            request: {
                type: 'GET',
                url: 'http://localhost:3000/products/' + id
            }
        });
    })
    .catch(err => {
        console.log(err);
        res.status(500).json({
            err: err
        });
    });
});

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Для обработки данных формы, состоящей из нескольких частей, анализатор тела bodyParser.urlencoded() или app.use(bodyParser.json()); не будет работать.

См. Предлагаемые модули здесь для разбора составных частей.

Вы должны будете использовать multer в этом случае

 var bodyParser = require('body-parser');
 var multer = require('multer');
 var upload = multer();

// for parsing application/json
app.use(bodyParser.json()); 

// for parsing application/xwww-
app.use(bodyParser.urlencoded({ extended: true })); 
//form-urlencoded

// for parsing multipart/form-data
app.use(upload.array()); 
app.use(express.static('public'));
0 голосов
/ 04 сентября 2018

Использование for ... of - отличная идея, но вы не можете использовать ее, как если бы вы просматривали свойства объекта. К счастью, в Javascript есть несколько новых функций, которые превращают «свойства объекта» в итеративные.

Использование Object.keys:

const input = {
  firstName: 'Evert',
} 
for (const key of Object.keys(input)) {
  console.log(key, input[key]);
}

Вы также можете использовать Object.entries для ввода ключей и значений:

const input = {
  firstName: 'Evert',
} 
for (const [key, value] of Object.entries(input)) {
  console.log(key, value);
}
...