@TostPOST

Почему пустой $_POST при запросе по fetch()?

Хочу реализовать background sync, для этого во время запросов на сохранение какого либо текста, запросы не идут на сервер, а сохраняются в indexedDB, потом при событии sync, service worker пробегается по всем объектам в IndexedDB и отправляет запросы на сервер, дело в том, что все запросы у меня через Ajax, с fetch работать не привык, то есть я как то адаптировал те данные для ajax запросов для fetch. В итоге при запросе на сервер нет никаких данных, $_POST пустой, php://input = "[object Object]", хотя Content-Type:'x-www-form-urlencoded'.
Вот код service worker'a:
self.addEventListener('sync',function(event){
    if(event.tag == 'requestsync'){
        request = indexedDB.open('requests');
        request.onsuccess = function(event){
            var db = event.target.result,storage,transaction,data;
            transaction = db.transaction('requeststorage','readonly');
            storage = transaction.objectStore('requeststorage');
            data = storage.getAll();
            data.onsuccess = function(event){
                data = event.target.result;
                for(key in data){
                    object = data[key];
                    console.log(object);
                    transaction = db.transaction('requeststorage','readwrite');
                    storage = transaction.objectStore('requeststorage');
                    delrequest = storage.delete(object.id);
                    delrequest.onsuccess = function(event){
                        console.log('Deleted request');
                    }
                    var settings = {
                        method: object.options.type,
                        mode:'cors',
                        headers: object.options.headers ? object.options.headers : {'Content-Type':'application/x-www-form-urlencoded'},
                        cache:'no-cache',
                        credentials:'include',
                        redirect:'follow',
                        body: object.data
                    };
                    fetch(object.options.url,settings).then(function(response){    
                        response.json();
                    })
                    .then(function(body){
                        console.log(body);
                    })
                }
            }
        }
        request.onupgradeneeded = function(event){
            var db = event.target.result;
            if(!db.objectStoreNames.contains('requeststorage')){
                db.createObjectStore('requeststorage',{keyPath:'id',autoIncrement:true});
            }
        }
    }
});

При этом сам код всю свою задачу выполняет, т.е. в settings содержаться все нужные данные.
  • Вопрос задан
  • 266 просмотров
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
В поле body можно положить строку, FormData, Blob или ArrayBuffer, у Вас же судя по всему кладется обычный объект. Нужно добавить трансформацию.

Ну и стоит получше разобраться в промисах, в частности
fetch(object.options.url,settings).then(function(response){    
                        response.json();
                    })
                    .then(function(body){
                        console.log(body); // здесь всегда будет undefined, независимо от ответа
                    })
подумайте почему так

P.S.
var db = event.target.result,storage,transaction,data;
руки бы оторвал...
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы