【问题标题】:How can I implement a firebase set request within a call back如何在回调中实现 Firebase 设置请求
【发布时间】:2019-10-20 07:24:52
【问题描述】:

我是 node js 的新手,我想在回调函数中将信息写入我的 firebase 数据库。

我一直在搜索,似乎回调是异步的。如何在此回调中使用 firestore?

    exports.registerRestaurantPayout = functions.firestore.document('*********')
  .onCreate(async (paymentSnap, context) => {

    var request = require('request');

    var authCode = paymentSnap.data().auth_code;
    var firstString = 'client_secret=********&code=';
    var secondString = '&grant_type=authorization_code';
    var dataString = firstString + authCode + secondString;

    var options = {
        url: 'https://connect.stripe.com/oauth/token',
        method: 'POST',
        body: dataString
    };

    function callback(error, response, body) {
        if (!error && response.statusCode === 200) {
            console.log(body);

            return await firestore.document('***********')
              .set({'account': body}, {merge: true});
            //return await paymentSnap.ref.set({'account': body}, {merge: true});
        }else{


            //return await paymentSnap.ref.set({'error' : error}, { merge: true });
        }
    }

    request(options, callback);

  });

我收到以下错误 Parsing error: Unexpected token firestore 即使我可以在回调之外使用 firestore。具体问题是回调中的return语句

【问题讨论】:

  • 您的代码是云函数的一部分吗?如果是,能否请您添加 Cloud Function 的完整代码?
  • @RenaudTarnec 感谢您的回复,我刚刚更新了代码,是的,它是云功能的一部分

标签: node.js firebase asynchronous google-cloud-firestore google-cloud-functions


【解决方案1】:

在云函数中,您应该使用 Promise 来处理异步任务(例如对条带 API 的 HTTP 调用,或对实时数据库的写入)。默认情况下request 不返回承诺,因此您需要使用接口包装器来处理请求,例如request-promise,并按照以下行调整您的代码:

const rp = require('request-promise');

exports.registerRestaurantPayout = functions.firestore.document('*********')
 .onCreate((paymentSnap, context) => {

   var authCode = paymentSnap.data().auth_code;
   var firstString = 'client_secret=**********=';
   var secondString = '&grant_type=authorization_code';
   var dataString = firstString + authCode + secondString;


   var options = { 
     method: 'POST',
     uri: 'https://connect.stripe.com/oauth/token',
     body: dataString,
     json: true // Automatically stringifies the body to JSON
   };

   return rp(options)
   .then(parsedBody => {
       return paymentSnap.ref.set({'account': parsedBody}, {merge: true});
   })
   .catch(err => {
       return paymentSnap.ref.set({'error' : err}, { merge: true });
   });

});

我还建议您观看 Firebase 团队关于云功能和承诺的以下两个“必看”视频:https://www.youtube.com/watch?v=7IkUgCLr5oAhttps://www.youtube.com/watch?v=652XeeKNHSk

【讨论】:

猜你喜欢
  • 2012-12-21
  • 2016-07-09
  • 2013-04-22
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2018-09-07
相关资源
最近更新 更多