Javascript Firebase云功能-承诺问题

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'

当运行我的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' 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很好的建议,我将尝试一下。谢谢