firestore отклоняет post-запрос от angularjs

#angularjs #firebase #google-cloud-firestore

#angularjs #firebase #google-cloud-firestore

Вопрос:

я пытаюсь добавить новый документ в предложения коллекции, используя $http.post метод в angularjs.

я получаю эту ошибку в консоли:

 Possibly unhandled rejection: {
    "data": {
        "error": {
            "code": 400,
            "message": "Invalid JSON payload received. Unexpected token.nfields[companyNamen^",
            "status": "INVALID_ARGUMENT"
        }
    },
    "status": 400,
    "config": {
        "method": "POST",
        "transformRequest": [null],
        "transformResponse": [null],
        "jsonpCallbackParam": "callback",
        "url": "https://firestore.googleapis.com/v1beta1/projects/syrian-sales-v2/databases/(default)/documents/Offers",
        "data": "fields[companyName]=qweamp;fields[description]=qweamp;fields[expiredDate]=qweamp;fields[title]=qweamp;fields[userId]=rsVWKar7UTMwUmcyYJbr6Rif4NN2",
        "headers": {
            "Content-Type": "application/json; charset=UTF-8;",
            "Accept": "application/json, text/plain, /"
        }
    },
    "statusText": "",
    "xhrStatus": "complete"
}
  

я перепробовал так много решений, но ни одно из них не сработало.

вот код контроллера:

 app.controller('insert_controller', function ($scope, $http, $httpParamSerializerJQLike) {

    let userId = "rsVWKar7UTMwUmcyYJbr6Rif4NN2";
    let url = "https://firestore.googleapis.com/v1beta1/projects/syrian-sales-v2/databases/(default)/documents/Offers";

    $scope.insertOffer = function () {
        let companyName = $scope.companyName;
        let title = $scope.title;
        let expiredDate = $scope.expiredDate;
        let description = $scope.description;
        let data = {
            "fields": {
                "companyName": companyName,
                "title": title,
                "expiredDate": expiredDate,
                "description": description,
                "userId": userId,
            }
        };

        $http({
            method: 'POST',
            url: url,
            data: $httpParamSerializerJQLike(data),
            headers: {
                'Content-Type': 'application/json; charset=UTF-8;'
            }
        }).then(function (res) {
            if (res.data){
                $scope.companyName = null;
                $scope.title = null;
                $scope.expiredDate = null;
                $scope.description = null;
                alert('Offer Added Successfully')
            }
        }).catch(function (err) {
            console.log(err);
            throw err
        });
    }
});
  

любая помощь была бы отличной, заранее спасибо

РЕДАКТИРОВАТЬ: я попытался отправить post-запрос от postman, и он работал с тем же URL-адресом и той же структурой данных json, которую я использую

Комментарии:

1. Похоже, что отправляемая вами полезная нагрузка не очень хорошо сформирована, я протестировал ее на Json lint, и поле CompanyName также вызвало ошибку, проверьте, как создать документ здесь: cloud.google.com/firestore/docs/reference/rest/v1beta1 /…

2. @HarifVelarde спасибо, но я уже решил проблему.

3. не могли бы вы поделиться в качестве ответа, как вы решаете эту проблему? Это будет полезно для других пользователей с аналогичным сценарием

4. @HarifVelarde да, конечно, на самом деле это не решение, это опечатка, я использовал неправильную структуру данных, я должен был добавить атрибут stringValue к каждому полю, так что на самом деле это ничего

5. Я имел в виду опубликовать его в качестве ответа, чтобы другие могли считать его решенным и воспользоваться ответом

Ответ №1:

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

Это старая схема:

 let data = {
    "fields": {
        "companyName": companyName,
        "title": title,
        "expiredDate": expiredDate,
        "description": description,
        "userId": userId,
    }
};
  

Это правильная схема, которая работала:

 let data = {
        "fields": {
            "companyName": {
                "stringValue": companyName
            },
            "title": {
                "stringValue": title
            },
            "expiredDate": {
                "stringValue": expiredDate
            },
            "description": {
                "stringValue": description
            },
            "userId": {
                "stringValue": userId
            },
        }
    };