Firebase HTTP Cloud Функция TimeOut? - PullRequest
0 голосов
/ 12 января 2019

Я работаю над проектом онлайн-приложения для Android. Он использует Firestore и Cloud Function.

В приложении бронь пройти три этапа

  1. фаза (Инициировать заказ): я получаю запрос заказа и нажимаю makeOrder() функцию вызываемого облака http, которая создает документ в коллекции заказов с полем status= "inProcess" и отправляет ответ с CHECKSUMHASH (используется для произвести оплату позже) клиенту.

  2. фаза (сделать платеж): если первая фаза завершена успешно, теперь пользователь должен выполнить платеж, используя CHECKSUMHASH, который генерируется на первой фазе. Если платеж TXN прошел успешно, API оплаты ( more ) также выдаст CHECKSUMHASH в ответ. Теперь я должен проверить CHECKSUMHASH на стороне сервера, чтобы гарантировать, что запрос не был подделан.

  3. фаза (Подтверждение заказа): На этом этапе необходимо проверить CHECKSUMHASH (сгенерировать с помощью APT для оплаты), поэтому я вызываю другую облачную функцию HTTP confirmOrder(). Если метод verifychecksum() возвращает true, я меняю статус "inProcess" на "pending".

Теперь проблема в том, что это всегда занимает больше 60 секунд, поэтому выдайте ошибку TimeOut.

Мои вопросы

  1. Требуется время, потому что я проверяю, существует ли документ или нет только после его создания

    db.collection(targetColRef).doc(data.TARGET_ID).collection('orders').doc(data.ORDER_ID).get();
    const time = getCurrentDate().time;
    if (doc.exists && (time - doc.orderTime) < 300) 
    
  2. Я бронирую заказ по этим трем этапам, это правильный способ сделать это?

    exports.confirmOrder = functions.https.onCall((data, context) => __awaiter(this, void 0, void 0, function* () {
        if(validateData()){
    
             yield new Promise((reject, resolve) => {
                      return verifychecksum(data,paytm_config.MERCHANT_KEY);
    
                  }).then((result) => __awaiter(this, void 0, void 0, function* () {
                      if (result) {
                         const doc = yield db.collection(targetColRef).doc(data.TARGET_ID).collection('orders').doc(data.ORDER_ID).get();
                           const time = getCurrentDateNumber().time;
                           if (doc.exists && (time - doc.orderTime) < 300) {
                          yield db.collection(targetColRef).doc(data.TARGET_ID).collection('orders').doc(data.ORDER_ID).update({ status: 'pending' });
                          }
                          else { //doc not exists
                             console.log("Order not exist Or time diff more than 300 sec ! /DATA=>" + JSON.stringify(data) + "/Context=>" + JSON.stringify(context));
                              throw new functions.https.HttpsError('permission-denied', 'Time Out!');
                          }
                      }
                      else { // result==false
                          console.log("Failed to verify checksum! /DATA=>" + JSON.stringify(data) + "/Context=>" + JSON.stringify(context));
                          throw new functions.https.HttpsError('permission-denied', 'bad request');
                      }
                      //..
                  })).catch((err) => {
                      throw new functions.https.HttpsError('permission-denied', err);
                  });
    
                  console.log("successfull");
    
                  return "successfull";
     }else{
            //.... }})):
    

1 Ответ

0 голосов
/ 12 января 2019

Среда, в которой выполняются ваши облачные функции, требует, чтобы вы возвращали либо значение, либо обещание, чтобы оно могло достоверно знать, когда ваша функция выполнена.

Если ваша облачная функция отключается через 60 секунд, очень вероятно, что вы не вернете никакого результата. В вашем случае я очень подозрительно отношусь к function* и:

yield new Promise((reject, resolve) => {

Я не вижу, где вы завершаете функцию генератора. Я совершенно уверен, что __awaiter как-то связан с этим, но я также уверен, что он не работает для вас.

Я рекомендую рефакторинг кода для использования более простых и часто используемых примитивов, таких как:

return new Promise((reject, resolve) => {

Если у вас есть несколько обещаний, которые необходимо выполнить до того, как функция будет выполнена, посмотрите на Promise.all(), что гораздо чаще, чем функции генератора.

Я настоятельно рекомендую проверить видео Дуга о обещаниях в облачных функциях .

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