Javascript Firebase云功能-承诺问题
当运行我的Firebase Cloud函数时,我的承诺和代码的执行顺序似乎不正常 控制台日志(缩短):Javascript Firebase云功能-承诺问题,javascript,firebase,promise,google-cloud-functions,Javascript,Firebase,Promise,Google Cloud Functions,当运行我的Firebase Cloud函数时,我的承诺和代码的执行顺序似乎不正常 控制台日志(缩短): 1: Function execution started 2: function checkLicenseKey() was successful 3: function checkPermissionsFromAuth() was successful 4: result undefined 5: Error: TypeError: Cannot read property 'uid'
1: Function execution started
2: function checkLicenseKey() was successful
3: function checkPermissionsFromAuth() was successful
4: result undefined
5: Error: TypeError: Cannot read property 'uid' of undefined // Points to marked spot in code
6: Unhandled error Error: Unknown error code: failed to connect.
7: Function execution took 4663 ms, finished with status code: 500
8: function getUserAuthObject() was successful { userObj is logged here }
我的Firebase云函数和一些额外代码(缩短):
1: Function execution started
2: function checkLicenseKey() was successful
3: function checkPermissionsFromAuth() was successful
4: result undefined
5: Error: TypeError: Cannot read property 'uid' of undefined // Points to marked spot in code
6: Unhandled error Error: Unknown error code: failed to connect.
7: Function execution took 4663 ms, finished with status code: 500
8: function getUserAuthObject() was successful { userObj is logged here }
exports.orgNew=函数
.区域(“欧洲西部3”)
.https.onCall((数据、上下文)=>{
var-userObj;
原基变异;
返回(
检查licenseKey(data.licenseKey)
。然后((结果)=>{
如果(!result.isValid){
抛出新函数。https.HttpsError(
“拒绝许可”,
“使用了无效的许可证密钥”
);
}
返回checkPermissionsFromAuth(上下文);
})
。然后((结果)=>{
返回getUserAuthObject(context.auth.uid);
})
。然后((结果)=>{
console.info(result);//错误:结果未定义(控制台中的第4行)!
userObj=result;//因此userObj也是未定义的!
返回createOrganization(数据,userObj);
//看起来,即使我的userObj还没有准备好,它也会被执行!
})
。然后((结果)=>{
orgID=result.id;
从模板返回loadDataFromTemplate(组织标识,上下文);
})
。然后((结果)=>{
返回addMember(orgID,userObj);
})
。然后((结果)=>{
返回sendConfirmation(userObj.email、userObj.displayName);
})
。然后((结果)=>{
返回{orgID,success:true};
})
.catch((错误)=>{
//处理错误
functions.logger.error(“error:,err”);
抛出新函数.https.HttpsError(“连接失败”);
})
);
});
函数createOrganization(数据,userObj){
const OrganizationRef=admin.firestore()集合(“组织”);
常量文件={
标题:data.title,
description:data.description,
元:{
id:OrganizationRef.id,
创建者:{
//错误指向下面一行,显然这是因为userObj仍然没有定义。
creatorUID:userObj.uid,
creatorEmail:userObj.email,
creatorName:userObj.displayName,
},
createdAt:admin.firestore.FieldValue.serverTimestamp(),
},
},
};
返回组织REF
.add(文件)
.然后((组织参考)=>{
functions.logger.info(“函数createOrganization()成功”);
返回组织REF;
})
.catch((错误)=>{
functions.logger.error(“创建组织时出错:”,错误);
抛出新函数.https.HttpsError(“连接失败”,错误);
});
}
函数getUserAuthObject(uid){
管理
.auth()
.getUser(uid)
.然后((userRecord)=>{
常量对象={
uid:userRecord.uid,
电子邮件:userRecord.email,
displayName:userRecord.displayName,
};
返回obj;
})
。然后((结果)=>{
functions.logger.info(“函数getUserAuthObject()成功”,结果);
返回结果
})
.catch((错误)=>{
functions.logger.error(“获取用户数据时出错:”,err);
抛出新函数.https.HttpsError(“连接失败”);
});
}
此处不包括所有其他函数,因为它们与问题无关
非常感谢您的帮助。谢谢从读取代码(即未经测试)来看,这似乎是因为您没有在getUserAuthObject()
函数中返回。因此,userObj
未定义
您应按如下方式对其进行调整:
function getUserAuthObject(uid) {
return admin // !!! See the return here !!!
.auth()
.getUser(uid)
.then((userRecord) => {
const obj = {
uid: userRecord.uid,
email: userRecord.email,
displayName: userRecord.displayName,
};
functions.logger.info("function getUserAuthObject() was successful", obj);
return obj;
})
.catch((err) => {
functions.logger.error("Error fetching user data:", err);
throw new functions.https.HttpsError("failed to connect");
});
}
顺便说一句,既然您不需要这样做,那么看看我们如何在这个函数中简化承诺链
return obj;
})
.then((result) => {
functions.logger.info("function getUserAuthObject() was successful", result);
return result
})
因为obj
不返回承诺。这并没有错,因为它返回了一个承诺,但这是多余的。从读取代码(即未经测试)来看,这似乎是因为您没有在getUserAuthObject()函数中返回承诺。因此,userObj
未定义
您应按如下方式对其进行调整:
function getUserAuthObject(uid) {
return admin // !!! See the return here !!!
.auth()
.getUser(uid)
.then((userRecord) => {
const obj = {
uid: userRecord.uid,
email: userRecord.email,
displayName: userRecord.displayName,
};
functions.logger.info("function getUserAuthObject() was successful", obj);
return obj;
})
.catch((err) => {
functions.logger.error("Error fetching user data:", err);
throw new functions.https.HttpsError("failed to connect");
});
}
顺便说一句,既然您不需要这样做,那么看看我们如何在这个函数中简化承诺链
return obj;
})
.then((result) => {
functions.logger.info("function getUserAuthObject() was successful", result);
return result
})
因为obj
不返回承诺。这并没有错,因为它返回了一个承诺,但这是多余的。谢谢!就这样!很简单,但我错过了。是的,我对多余的部分有点不满意。我也会修好的。谢谢!就这样!很简单,但我错过了。是的,我对多余的部分有点不满意。也会解决这个问题。不相关的注意:您还可以使用并行执行loadDataFromTemplate
、addMember
和sendConfirmation
调用,因为它们似乎互不依赖。@samthecodingman很好的建议,我将尝试一下。谢谢不相关的注意事项:您也可以使用并行执行loadDataFromTemplate
、addMember
和sendConfirmation
调用,因为它们似乎互不依赖。@samthecodingman很好的建议,我将尝试一下。谢谢