Получение нулевого значения из облака Firebase, несмотря на все правильно - PullRequest
0 голосов
/ 07 октября 2018

Я написал облачную функцию на TypeScript, которая имеет async вызовов внутри.

exports.validateOtp = functions.https.onCall((data,context)=>{
  phoneNumber = data.phoneNumber;
  otp = data.otp;
  let email:string = data.email;
  let password:string = data.password;
  let displayName:string= data.displayName;

  authFunction.otpValidation(phoneNumber,otp,(otpErr,otpValue) => {
    if(otpErr){
      console.error(otpErr);
      return {otpErr};
    }else{ 
    return authFunction.createUser(email,false,phoneNumber,password,displayName,false,(err,value) => {
        if(err) 
        {
          console.error(err);
          return Promise.reject(err);
        }
        else{
          console.log(value); 
          return Promise.resolve(value);
        }                  
          });
    } 
});
  });

Ниже приведена реализация authFunction.otpValidation

 otpValidation(phoneNumber:string, otp:string,callback:Function){
  let otpValidationApi:string = "https://<api>/verifyRequestOTP.php?authkey="+this.authKey+"&mobile="+phoneNumber+
  "&otp="+otp;
  https.get(otpValidationApi, (resp) => {
    let data = '';
    resp.on('data', (chunk) => {
      data += chunk;
      });
      resp.on('end', () => {
        let result = JSON.parse(data);
        var y=result.type;
        callback(null,y);
      });
  }).on("error",(err)=>{
    console.log("Error: "+err.message);
  });
 }

Япытаясь перехватить его выходное / возвращаемое значение через приложение Android, используя:

private static FirebaseFunctions mFunctions = FirebaseFunctions.getInstance();
mFunctions.getHttpsCallable(nameOfFunction).call(data)
           .continueWith(new Continuation<HttpsCallableResult, String>() {
               @Override
               public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
                   String result2 = (String) task.getResult().getData();
                   return result2;
               }
           });

Однако переменная result2 в коде Android всегда возвращает ноль, даже если облачная функция работает должным образом.

Где я ошибаюсь?

1 Ответ

0 голосов
/ 07 октября 2018

Поскольку otpValidation также вызывает HTTP API, вам нужно, чтобы он возвращал обещание, а затем "выдавал" обещания вверх и из облачной функции.Прямо сейчас вы ничего не возвращаете из кода верхнего уровня, и это означает, что Cloud Functions могут закрыть ваш код в любой момент после запуска финального }, что, вероятно, пока выполняется HTTP-вызов (не говоря уже оcreateUser call).

Первый шаг - otpValidation вернуть обещание и разрешить / отклонить это обещание:

 otpValidation(phoneNumber:string, otp:string): Promise<Any> {
   let otpValidationApi:string = "https://<api>/verifyRequestOTP.php?authkey="+this.authKey+"&mobile="+phoneNumber+
  "&otp="+otp;
   return new Promise(function(resolve, reject) {
     https.get(otpValidationApi, (resp) => {
       let data = '';
       resp.on('data', (chunk) => {
         data += chunk;
       });
       resp.on('end', () => {
         let result = JSON.parse(data);
         var y=result.type;
         resolve(y);
       });
     }).on("error",(err)=>{
       console.log("Error: "+err.message);
       reject(err);
     });
   });
 }

С этим способом вы можетевернуть результат вызова otpValidation и объединить все вызовы then() вместе:

exports.validateOtp = functions.https.onCall((data,context)=>{
  phoneNumber = data.phoneNumber;
  otp = data.otp;
  let email:string = data.email;
  let password:string = data.password;
  let displayName:string= data.displayName;

  return authFunction.otpValidation(phoneNumber,otp).then(function(optValue) {
    return authFunction.createUser(email,false,phoneNumber,password,displayName,false,(err,value) => {
        if(err) 
        {
          console.error(err);
          return Promise.reject(err);
        }
        else{
          console.log(value); 
          return Promise.resolve(value);
        }                  
      });
    } 
});

После прочтения остальной части кода вам, возможно, придется преобразовать authFunction.createUser, чтобы также вернуть обещание.Если так, то подход будет таким же, как я сделал для вашей auth.otpValidation выше.

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