Поскольку 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
выше.