Как я могу реализовать запрос набора firebase в обратном звонке - PullRequest
0 голосов
/ 04 июня 2019

Я новичок в узле 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);

  });

Я получаю следующую ошибку: Ошибка синтаксического анализа: Неожиданное хранилище токенов, хотя я могу использовать хранилище за пределами обратного вызова. Конкретной проблемой является оператор return в обратном вызове

1 Ответ

2 голосов
/ 04 июня 2019

В облачной функции вы должны использовать обещания для обработки асинхронных задач (например, HTTP-вызов в чередующийся API или запись в базу данных реального времени). По умолчанию 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=7IkUgCLr5oA и https://www.youtube.com/watch?v=652XeeKNHSk.

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