Сохранить ответ из ax ios GET в базу данных Firebase в JavaScript части функции Firebase - PullRequest
0 голосов
/ 25 марта 2020

Написали функцию, которая отлично работает, кроме следующего:

  • Желаемое поведение: это сохранение response.data полученного от ax ios GET обратного вызова в базе данных Firebase

  • Specifi c проблема: данные не сохраняются в Firebase, и функция завершается с кодом состояния: ошибка 500

  • Код: следующий код фрагмент функции, строка, которая не работает, является .update (response.data)

Консоль выводит код состояния: 500 и k, posID, name значения:

enter image description here

Код (редактировать: включить всю функцию согласно предоставленным комментариям) :

    exports.doshiiMenuUpdatedWebhook = functions.https.onRequest((req, res) => {

  // Forbidding PUT requests.
  if (req.method === 'PUT') {
    return res.status(403).send('Forbidden!');
  }

  cors(req, res, () => {

    let verify = req.query.verify;
    let locationId = req.body.data.locationId
    let posId = req.body.data.posId
    let type = req.body.data.type
    let uri = req.body.data.uri
    let itemUri = req.body.data.itemUri

    var token = jwttoken();

    const options = {
        headers: {'authorization': 'Bearer ' + token}
      };


    switch (type) {

    case 'products':
        console.log('Event - specific menu item updated');
        console.log('jwt: ', token);


        axios.get(itemUri, options)
          .then(response => {

            console.log('response status: ', response.status);
            console.log('response statusText: ', response.statusText);

            return admin.database().ref(`/venue-menus/${locationId}/products`)
                 .once('value').then((snapshot) => {

                  var products = snapshot.val();
                  var keys = Object.keys(products);

                  for (var i = 0; i < keys.length; i++){

                    var k = keys[i];
                    var name = products[k].name;
                    var posID = products[k].posId;

                    if (posID === posId){

                      console.log(k, posID, name); 
                      admin.database().ref(`/venue-menus/${locationId}/products/${key}/`).update(response.data);

                    }//end if

                  }//end for

                  return snapshot
                });

          })
          .then(response => {
                    return res.status(200).send(type)
            })
          .catch(err => {
            return res.status(500).send({error: err})
          })//end axios


        break;
    case 'options':
        console.log('Event - specific menu option updated');
        console.log('jwt: ', token);
        break;
    case 'surcounts':
        console.log('Event - specific menu surcount updated');
        console.log('jwt: ', token);


        break;
    default:
        console.log('Event - entire menu  updated');
        console.log('jwt: ', token);

        axios.get(uri, options)
          .then(response => {

            console.log('response status: ', response.status);
            console.log('response statusText: ', response.statusText);

            return admin.database().ref(`/venue-menus/${locationId}/`).set(response.data)
          })
          .then(response => {
                    return res.status(200).send(type)
            })
          .catch(err => {
            return res.status(500).send({error: err})
          })//end axios


    }//end switch



  })//end cors

});

1 Ответ

0 голосов
/ 25 марта 2020

Ваш код игнорирует обещание, возвращенное после звонка на update(). Функции HTTP должны отправлять ответ только после того, как все работа asyn c завершена. Если какая-либо операция будет незавершенной во время ответа, ее можно будет отбросить до конца, поскольку облачные функции очистятся и перейдут к следующему запросу без ожидания.

Вместо этого следует вернуть значение этого обещания, так что он может распространяться по всей цепочке. (Или лучше использовать синтаксис JavaScript async / await, чтобы избежать всех вложенных обратных вызовов, которые трудно отследить.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...