Полученный объект formData содержит скобки на ключе, не может разобрать их до Json - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть внешнее приложение, которое отправляет formData, которая содержит массивы, поэтому я использую «object-to-formdata» для анализа следующего объекта:

{
        "profileImage": {
            "name": "5574c060-853b-4999-ba39-1c66d5329704",
            "size": 364985,
            "mimetype": "image/png",
            "url": "uploads/5574c060-853b-4999-ba39-1c66d5329704"
        },
        "skills": [],
        "lessonsFinished": [],
        "classes": [],
        "_id": "5e3c2f8c80776b12cc336fdf",
        "email": "test@test.com",
        "password": "$2b$10$iZ3/BuklZ1FCGlyQDPUyMOhcWAfei5yl.llYScbWIv12XWcsokrgS",
        "username": "adrian",
        "verified": false,
        "status": "student",
        "color": "blue",
        "verificationCode": "50SZWPCHDL685C",
        "__v": 0,
        "lastName": "Test",
        "name": "Test",
    }

Объект содержит объекты и массивы, и когда анализируется и отправляется на сервер, который использует express, с bodyParser и "express -fileupload" в качестве файлового менеджера, я получаю этот объект:

{
    'profileImage[name]': '5574c060-853b-4999-ba39-1c66d5329704',   
    'profileImage[size]': '364985',
    'profileImage[mimetype]': 'image/png',
    'profileImage[url]': 'uploads/5574c060-853b-4999-ba39-1c66d5329704',
    'skills[]': '',
    'lessonsFinished[]': '',
    'classes[]': '',
    _id: '5e3c2f8c80776b12cc336fdf',
    email: 'test@test.com',
    password: '$2b$10$iZ3/BuklZ1FCGlyQDPUyMOhcWAfei5yl.llYScbWIv12XWcsokrgS',
    username: 'adrian',
    verified: 'false',
    status: 'student',
    color: 'blue',
    verificationCode: '50SZWPCHDL685C',
    __v: '0',
    lastName: 'Test',
    name: 'Test',
  }

Я не могу показаться чтобы найти способ синтаксического анализа этого в нормальном объекте, так как мне нужно использовать полный объект в качестве параметра запроса для конфигурации mon goose.

Моя Express выглядит следующим образом:

const bodyParser = require('body-parser');
const fileUpload = require('express-fileupload');
const express = require('express');

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

Наконец, у меня есть конечная точка, в которой я получаю данные формы:

exports.create = function (model) {
    return async function (req, res, next) {
        try {
            let document = req.body;
            if (req.files) {
                Object.keys(req.files).forEach(key => {
                    let file = req.files[key]
                    file.mv(upload_dir + file.name, (err) => {
                        if (err) return res.status(500).send(err);
                    });
                    document[key] = {
                        name: file.name,
                        size: file.size,
                        mimetype: file.mimetype,
                        url: upload_dir + file.name
                    }
                })
            }
            const newDocument = await new model(req.body).save();
            res.status(200).send(newDocument);
        } catch (err) {
            return next({
                status: 500,
                message: err.message
            })
        }
    }
}

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

Я попробовал решения, представленные в этой теме: Как преобразовать FormData (HTML5 Object) в JSON, но те просто создают Объект с скобками, включенными в ключ ...

Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Решено !, я обнаружил, что 'express -fileupload' переопределяет bodyParser, и по умолчанию используется опция, которая выравнивает вывод, чтобы решить эту проблему, установите fileupload как:

app.use(fileUpload({
     parseNested: true 
}));
0 голосов
/ 12 февраля 2020

Это не лучший пример для преобразования вашего key[array], но на этот раз, возможно, вы сможете использовать этот код ниже для анализа объекта key[array] в реальном объекте .

const myArrays = {
    'profileImage[name]': '5574c060-853b-4999-ba39-1c66d5329704',   
    'profileImage[size]': '364985',
    'profileImage[mimetype]': 'image/png',
    'profileImage[url]': 'uploads/5574c060-853b-4999-ba39-1c66d5329704',
    'skills[]': '',
    'lessonsFinished[]': '',
    'classes[]': '',
    _id: '5e3c2f8c80776b12cc336fdf',
    email: 'test@test.com',
    password: '$2b$10$iZ3/BuklZ1FCGlyQDPUyMOhcWAfei5yl.llYScbWIv12XWcsokrgS',
    username: 'adrian',
    verified: 'false',
    status: 'student',
    color: 'blue',
    verificationCode: '50SZWPCHDL685C',
    __v: '0',
    lastName: 'Test',
    name: 'Test',
  };

  function parseFormDataToObject(formObject) {
    Object.keys(formObject).forEach((key, index) => {
      let firstIndex = key.indexOf('[');
      let lastIndex = key.lastIndexOf(']');
      
      if(firstIndex !== -1 && lastIndex !== -1) {
        let name = key.slice(firstIndex + 1, lastIndex);
        let newKey = key.slice(0, firstIndex);
        if(!name) {
          formObject[newKey] = [];
        } else {
          if(!formObject[newKey]) {
            formObject[newKey] = {};
          }
  
          // console.log(myArrays[key]);
          formObject[newKey][name] = formObject[key];
        }
        delete formObject[key];
      }
    });

    return formObject;
  };

  console.log(parseFormDataToObject(myArrays))

Надеюсь, это поможет вам.

...