Google云功能有时有效,有时无效

时间:2019-11-02 10:44:25

标签: javascript node.js firebase google-cloud-firestore google-cloud-functions

我正在使用Firestore的onCreate函数来检测用户注册并使用其用户ID创建文档。问题在于该功能有时可以正常工作,而其他时间则无法正常工作。另外,每当函数运行时,我总是收到“函数返回的未定义,期望的承诺或值”错误。我已经尝试过许多在类似问题上给出的解决方案,但是仍然没有运气。

export const createNewUser = functions.auth.user().onCreate(user => {
  const userId = user.uid;

  const updateData = {
    ads_watched: 0,
    coins: 20000,
    gems: 0
  };

  admin.firestore().doc("cashon/" + userId)
  .set(updateData)
  .then(writeResult => {
      console.log("User Created result:", writeResult);
      return null;
  })
  .catch(err => {
      console.log(err);
      return null;
    });
});

1 个答案:

答案 0 :(得分:1)

您需要返回set()异步方法返回的promise,如下所示:

export const createNewUser = functions.auth.user().onCreate(user => {
  const userId = user.uid;

  const updateData = {
    ads_watched: 0,
    coins: 20000,
    gems: 0
  };

  return admin.firestore().doc("cashon/" + userId)
  .set(updateData)
  .then(() => {
      console.log("User Created result:", writeResult);
      return null;
  })
  .catch(err => {
      console.log(err);
      return null;
    });
});

如“函数返回未定义的,预期的承诺或值”错误所示,您必须在后台触发的Cloud Function中返回Promise或值,以向平台指示Cloud Function已完成。由于您未返回Promise,因此会遇到这种不一致的行为:有时,Cloud Function在平台写入Firestore之前就被平台杀死了。

我建议您观看道格·史蒂文森(https://firebase.google.com/docs/functions/video-series/)的Firebase视频系列中有关“ JavaScript承诺”的3个视频,它们解释了这一关键点。

还要注意,set()方法返回一个Promise<void>

最后,请注意,如果不需要console.log("User Created result:", writeResult);,则可以执行以下操作:

export const createNewUser = functions.auth.user().onCreate(user => {
  const userId = user.uid;

  const updateData = {
    ads_watched: 0,
    coins: 20000,
    gems: 0
  };

  return admin.firestore().doc("cashon/" + userId)
  .set(updateData)
  .catch(err => {
      console.log(err);
      return null;
    });
});