【问题标题】:Getting null from firebase cloud despite everything is correct尽管一切都是正确的,但从 Firebase 云中获取 null
【发布时间】:2018-10-07 13:55:10
【问题描述】:

我用 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;
               }
           });

然而,Android 代码中的 result2 变量总是返回 null,即使云函数按预期运行。

我哪里弄错了?

【问题讨论】:

  • 什么是authFunction.otpValidation
  • @FrankvanPuffelen 编辑了添加 authFunction.otpValidation 方法的问题。

标签: typescript firebase google-cloud-functions


【解决方案1】:

由于otpValidation 也在调用 HTTP API,您需要让它返回一个承诺,然后将承诺“冒泡”并从云函数中取出。现在您没有从顶级代码返回任何内容,这意味着 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 所做的相同。

【讨论】:

  • 这很好..感谢弗兰克的帮助...我必须说,firebase 开发团队非常努力地支持其用户:)
  • 我们喜欢帮助其他开发者。您使用 Firebase 只是一个奖励。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
相关资源
最近更新 更多