Responsejs fetch - тело: json.stringify

Мой объект Json выглядит так:

[
{
    "keys": {
        "_1": ".",
        "_2": ".",
        "_3": "."
    },
    "credits": -200,
    "_id": "5c1e3e7531dccf0017cf70b9",
    "firstName": "Martin",
    "lastName": "Seubert",
    "username": "admin",
    "createdDate": "2018-12-22T13:39:01.244Z",
    "__v": 0,
    "id": "5c1e3e7531dccf0017cf70b9"
}
]

Я хочу, чтобы следующая функция установила для ключей значение, которое я беру из другого API:

updateKeys() {
  let user = JSON.parse(localStorage.getItem('user'));
  var requestUrl = 'https://mighty-atoll-75521.herokuapp.com/users/';
  var id = user._id
  fetch(requestUrl + id, {
      method: 'put',
      headers: {
        ...authHeader(),
        'Accept': 'application/json, text/plain, */*',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({keys._1:  this.props.code})
    })
}

Но я получаю это сообщение об ошибке в браузере:

Responsejs fetch - тело: json.stringify

Есть ли у вас какие-нибудь предложения для меня?

С наилучшими пожеланиями

Мартин

Обновлено:

Здесь вы можете найти полный код: https://github.com/kamami/prototype/blob/RealDatabase/src/components/ProgressMobileStepper.jsx

Используйте квадратную скобку для keys._1

Alfred Ayi-bonte 27.12.2018 15:57

квадратная скобка должна выглядеть как keys['_1']

rc_dz 27.12.2018 16:14

Спасибо за ответ, но это дает мне следующую ошибку: "ключи" не определены. Я отредактировал свой пост и добавил для вас репо на github :)

Martin Seubert 27.12.2018 16:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
2 500
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы не можете создать объект с таким именем свойства, как keys._1.

Вам нужно будет сделать это в 2 этапа:

var o = {};
o.keys = {};
o.keys._1 = this.props.code;

Если это было намерение, вы можете процитировать его

o['keys._1'] = this.props.code;

Вы можете создать объект со значением имени свойства, используя квадратную скобку, т.е. {[keys._1]: "некоторая ценность"} @Karel Frajták

Alfred Ayi-bonte 27.12.2018 16:26
    updateKeys() {
  let user = JSON.parse(localStorage.getItem('user'));
  var requestUrl = 'https://mighty-atoll-75521.herokuapp.com/users/';
  var id = user._id
  fetch(requestUrl + id, {
      method: 'put',
      headers: {
        ...authHeader(),
        'Accept': 'application/json, text/plain, */*',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({[keys._1]:  this.props.code})
    })
}

Я не думаю, что OP на самом деле пытается этого добиться. См. Ответ Карела.

Jared Smith 27.12.2018 16:15

@JaredSmith посмотрел на ошибку, компиляция завершилась неудачно в тот момент, когда он устанавливал ключ. По моему решению, которое устраняет ошибку. Ясно, что он хочет использовать значение keys._1 в качестве ключа, поэтому я считаю, что мое решение сработает для него.

Alfred Ayi-bonte 27.12.2018 16:20

Спасибо за ответ, но это дает мне следующую ошибку: "ключи" не определены. Я отредактировал свой пост и добавил для вас репо на github :)

Martin Seubert 27.12.2018 16:49

@MartinSeubert, это ваш код, поэтому вы должны знать, откуда берется keys, @Alfred работает с тем, что вы предоставили.

Karel Frajták 27.12.2018 16:52

@ KarelFrajták keys - это свойство в моем json.

Martin Seubert 27.12.2018 17:01

@MartinSeubert Я думал, что keys - это объект с узлом _1. По сути, отправка значения keys._1 как ключа со значением this.props.code на бэкэнд.

Alfred Ayi-bonte 27.12.2018 17:12

@ KarelFrajták Именно так! Венн, мое тело выглядит, например, вот так: body: JSON.stringify ({firstName: this.props.code}) он работает нормально. Но body: JSON.stringify ({[keys._1]: this.props.code}) дает мне ошибку: «ключи» не определены

Martin Seubert 27.12.2018 17:42
Ответ принят как подходящий

Вы пытаетесь использовать переменную как «свойство», поэтому вам нужен ComputedPropertyName из ES6. Попробуйте с body: JSON.stringify({[keys._1]: this.props.code}) вместо body: JSON.stringify({keys._1: this.props.code})

Спасибо за ответ, но это дает мне следующую ошибку: "ключи" не определены. Я отредактировал свой пост и добавил для вас репо на github :)

Martin Seubert 27.12.2018 16:49

Давай попробуем еще :). Я думаю, вы хотите обновить JSON, и вы передаете path, чтобы изменить его, поэтому он будет одним из следующих: 1) {'keys._1': this.props.code} 2) {'keys': { '_1': this.props.code}}

y4izus 27.12.2018 17:35

Хорошо :) Итак, мой последний json должен выглядеть так: code [{"keys": {"_1": "12345", "_2": "6789", "_3": "111213"}}] code

Martin Seubert 27.12.2018 18:01

У меня есть несколько предметов, каждый со своим кодом. Когда я нажимаю кнопку в своем приложении, этот код должен быть размещен в api, чтобы каждый пользователь мог сохранить все свои купленные коды! Надеюсь, это проясняет ситуацию :) Или массив будет лучшим решением?

Martin Seubert 27.12.2018 18:05

Даже если у вас есть несколько элементов, когда вы нажимаете кнопку, вы хотите обновить именно этот user, а не весь ваш массив, не так ли? поэтому в body вы должны сохранить ту же структуру, что и у вашего пользователя, а не массив. Я имею в виду, если ваша структура user - это `{" keys ": {" _1 ":". "," _2 ":". ",}," FirstName ":" Martin "," lastName ":" Seubert "," имя пользователя ":" admin "}` и вы хотите изменить keys._1, body должен выглядеть так: {'keys': { '_1': this.props.code}} (та же структура, что и у user)

y4izus 28.12.2018 07:55

Работает как шарм, ты спас мне день! Спасибо

Martin Seubert 28.12.2018 13:26

Чтобы было понятно, я не хочу, чтобы значения были моими новыми ключами. Я просто хочу перезаписать свои старые значения!

Я пробовал вот это:

  body: JSON.stringify({[user.keys[[this.props.matchId]]]: this.props.code})

Но в моих инструментах разработчика это выглядит так:

В качестве ключа он принимает значение, но я этого не хочу. Должно получиться так:

{key._1: true}

Другие вопросы по теме