Задать вопрос

Почему JSON.stringify теряет часть объекта?

Добрый день! У меня есть JavaScript объект
let form = {
  img: "...", // тут закодированная base64 строка
  name: "smth",
  desc: "smth"
}

При попытке превратить объект в строку для передачи, возникает проблема: на выходе получается такая строка:
{"name":"smth","desc":"smth"}
То бишь, куда-то затерялось base64 изображение.

Можно ли это как-то поправить?
5e1da89c514b3389809105.png

Весь код

document.getElementById("back").addEventListener("click", function(e){
  move("search")
})

document.getElementById('ok').addEventListener('click', () => {
  let form = {};
  if(document.getElementById('load_img').files.length > 0) {
    var img = document.getElementById('load_img').files[0];
    var reader = new FileReader();
    reader.readAsDataURL(img);
    reader.onload = function() {
      form.img = encodeURIComponent((reader.result).split(',')[1]);
      // form.img = encodeURIComponent(btoa('hahahahahahh'));
    }
  } else {
    form.img = '';
  }

  form.name = encodeURIComponent(document.getElementById('name').value);
  form.desc = encodeURIComponent(document.getElementById('desc').value);

  console.log(form);

  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://host/api/?product.create=' + JSON.stringify(form));
  // xhr.send();

  console.log('Form: ' + form);
  console.log(JSON.stringify(form));

  xhr.onreadystatechange = () => {
    if(xhr.readyState == 4 && xhr.status == 200) {
      console.log(xhr.responseText);
      var data = JSON.parse(xhr.responseText);

      if(data.code == 1) {
        alert('Товар успешно создан');
        move('search');
      } else {
        alert('Ошибка! ' + data.text);
        move('search');
      }
    }
  }
});

  • Вопрос задан
  • 498 просмотров
Подписаться 2 Средний 4 комментария
Решения вопроса 1
tdesu
@tdesu Автор вопроса
Решил проблему ;)
Проблема была в том, что ридер файла работает в асинхроне, как и сказал Алексей Тен .
Благодарю всех за помощь!
Корректный ответ
5e1daf62b288b013629026.png


Поместил XHR отправку в отдельную функцию и вызываю только когда сработает "onload" у ридера файлов.
Листинг

let form = {};
document.getElementById('ok').addEventListener('click', () => {
  if(document.getElementById('load_img').files.length > 0) {
    var img = document.getElementById('load_img').files[0];
    var reader = new FileReader();
    reader.readAsDataURL(img);
    reader.onload = function() {
      form.img = encodeURIComponent((reader.result).split(',')[1]);
      form.name = encodeURIComponent(document.getElementById('name').value);
      form.desc = encodeURIComponent(document.getElementById('desc').value);
      send();
    }
  } else {
    form.img = '';
    form.name = encodeURIComponent(document.getElementById('name').value);
    form.desc = encodeURIComponent(document.getElementById('desc').value);
    send();
  }

  console.log(form);
});

function send() {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://host/api/?product.create=' + JSON.stringify(form));
  // xhr.send();

  console.log('Form: ' + form);
  console.log(JSON.stringify(form));

  xhr.onreadystatechange = () => {
    if(xhr.readyState == 4 && xhr.status == 200) {
      console.log(xhr.responseText);
      var data = JSON.parse(xhr.responseText);

      if(data.code == 1) {
        alert('Товар успешно создан');
        move('search');
      } else {
        alert('Ошибка! ' + data.text);
        move('search');
      }
    }
  }
}

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@akhoronko
form.img заполняется асинхронно в reader.onload, поэтому в момент вызова JSON.stringify его может не быть
Ответ написан
Комментировать
Chefranov
@Chefranov
Новичок
При формировании base64 картинки у вас наверно есть перевод строк или типа того. По коду должно работать

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
Wanted. Москва
от 250 000 до 400 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
22 янв. 2025, в 21:33
3000 руб./за проект
22 янв. 2025, в 18:00
15000 руб./за проект
22 янв. 2025, в 17:57
2000 руб./в час