尽管一切正确,但仍从Firebase云中获取空值

时间:2018-10-07 13:55:10

标签: typescript firebase google-cloud-functions

我已经用TypeScript编写了一个Cloud Function,其中包含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;
               }
           });

但是,即使Cloud Function正常运行,Android代码中的result2变量也始终返回null。

我在哪里弄错了?

1 个答案:

答案 0 :(得分:1)

由于otpValidation也正在调用HTTP API,因此您需要让它返回一个Promise,然后“冒泡” Promise并从Cloud Function中退出。目前,您没有从顶级代码返回任何内容,这意味着Cloud Functions可能会在最终}运行之后的任何时候关闭您的代码,这很可能是在HTTP调用仍在运行的时候(让单独的createUser调用)。

第一步是让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所做的相同。