Как на javascript передать переменные в тело POST запроса (fetch)?

Есть файл с html-разметкой. К нему подключен файл js.

Нужно сделать POST-запрос с помощью fetch. Хочу использовать в теле запроса переменную.

Получаю значения переменной из клика по элементу списка. В html-файле:

При нажатии на элемент списка вызывается функция getType:

<li onclick="getType(event)" v-for="i in types"> {{ i }} </li>

(types - просто массив)

Кнопка, по нажатию которой должен происходить запрос (также находится в html-файле):

             <div id="button">
                <button class="btn btn-success" 
                onclick="
                sendCalcRequestF('POST', requestCalcURL, body)
                .then(data => console.log(data))
                .catch(err => console.log(err))
                "
                ondblclick="echo()">
                рассчитать
            </button>
            </div>

Код в js-файле:

let chooseType;

function getType(event) {
    chooseType = event.target.innerHTML;
    console.log(chooseType);
    return chooseType;
}

const body = {
    type: chooseType,
 }

const headers = {
    'Content-type': 'application/json'
}

function sendCalcRequestF(method, url, body) {
    return fetch(url, {
        method: method,
        body: JSON.stringify(body),
        headers: headers
    }).then(response => {
        return response.json()
    })
}

function echo() {
     console.log("body", body)
}             

Полученные с помощью getType данные нормально выводятся в консоль, но тело запроса в итоге остаётся пустым (это видно при выводе его в консоль, и запрос не работает)

Тело при выводе в консоль выглядит так (вывожу с помощью функции echo(), описанной в js-файле и вызываемой при двойном клике на кнопку):

{type: undefined}

Причём тот же самый код совершенно нормально работает с другим body, где значение задано изначально:

const body2 = {
    type: "шрот"
}

(остальной код не меняю, просто вместо body передаю в функцию в качестве параметра body2, и всё работает)


Ответы (1 шт):

Автор решения: Meth0d

вам нужно инициализировать переменную const body = {} в начале, а не chooseType и в функции getType заполнять body.type = event.target.innerHTML. В таком случае все работать будет. До этого заполнение body происходило при рендере страницы, поэтому там и undefined, теперь же заполнение происходит по событию - именно то что вам нужно

→ Ссылка