【问题标题】:Save response from axios GET call to Firebase database in JavaScript part of a Firebase function将来自 axios GET 调用的响应保存到 Firebase 函数的 JavaScript 部分中的 Firebase 数据库
【发布时间】:2020-03-25 07:48:15
【问题描述】:

已经编写了一个除了以下之外可以正常工作的函数:

  • 期望的行为:将从 axios GET 调用收到的 response.data 保存回 Firebase 数据库

  • 具体问题:数据未保存到 Firebase 和 函数以状态码终止:500 错误

  • 代码:以下代码是函数的sn-p,行 不工作的是 .update(response.data)

控制台输出状态码:500 和k, posID, name 值:

代码(编辑:根据提供的 cmets 包含整个函数)

    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

});

【问题讨论】:

  • 这里的代码太少,无法说明发生了什么。请编辑问题以显示以您描述的方式失败的最小完整云功能部署。我要指出的是,您根本没有处理调用 update() 的错误。请阅读:stackoverflow.com/help/minimal-reproducible-example
  • 已更新问题以包含整个功能。让我指出,switch 语句的default 部分中的.set() 调用非常有效。

标签: javascript node.js firebase-realtime-database google-cloud-functions


【解决方案1】:

您的代码忽略了调用update() 返回的承诺。 HTTP 函数只能在所有异步工作完成后发送响应。如果在响应时任何操作未完成,它可能会被完全删除,因为 Cloud Functions 会清理并继续下一个请求而无需等待。

您应该返回该承诺的值,以便它可以沿链传播。 (或者更好的是,使用 JavaScript async/await 语法来避免所有难以跟踪的嵌套回调。)

【讨论】:

  • 感谢您的反馈,我对 JS 还是很陌生,所以只是想弄清楚我需要对代码进行哪些更改:/
猜你喜欢
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多