我已经用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。
我在哪里弄错了?
答案 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
所做的相同。