从 Cloud Functions for Firebase 获取当前用户 ID(PubSub 触发器)

Posted

技术标签:

【中文标题】从 Cloud Functions for Firebase 获取当前用户 ID(PubSub 触发器)【英文标题】:Get current user id from Cloud Functions for Firebase ( PubSub trigger) 【发布时间】:2021-08-05 19:42:01 【问题描述】:

当我需要客户端当前的用户ID时,我可以使用:firebase.auth().currentUser.uid

如何在云函数中获取当前用户 ID(Pub Sub 触发器)?

exports.sendPushNotification = functions.pubsub.schedule("* * * * *")
.onRun(async (context) => 
  const today = new Date();
  const date = today.getFullYear()+"-"+(today.getMonth()+1)+
  "-"+today.getDate();

  const query = await db.collection("posts")
      .where("date", "==", date)
      .where("idUser", "==", i need here to call my current user id)
      .get();

  query.forEach(async (snapshot) => 
    sendNotification(snapshot.data().idUser, snapshot.data().title);
  );
);

【问题讨论】:

虽然 dharmaraj 已经回答了您的问题,但是使用 Cloud Firestore onCreate trigger 可以更好地实现您使用此触发器的目的,这将为您提供创建的帖子以及创建者。但是,我不确定您为什么要向发布该帖子的人发送有关该帖子的通知。 我正在向发布通知的人发送通知,因为他们正在发布发票。并在发票到期日收到推送通知以记住到期日。 @WafaBergaoui 我猜您想在用户的发票待处理时向他们发送通知。请分享存储到期数据的发票的 Firestore 文档的屏幕截图。 这是截图i.stack.imgur.com/XYIgD.png @WafaBergaoui 我添加了一个您可以使用的解决方法,如果答案有帮助,您可以通过单击勾选图标接受它,以便其他人知道它已解决,否则请随时提出更多问题。跨度> 【参考方案1】:

不,您无法在预定的云功能中获取任何 UID。该函数不是由用户调用的。它只是根据您的日程安排定期调用。 documentation 说:

此字段仅为实时数据库触发器和 可调用函数。对于未经身份验证的用户,此字段为空。 对于不提供用户的 Firebase 管理员用户和事件类型 信息,该字段不存在。

本例中的上下文对象如下所示:


  "eventId": "eventId",
  "timestamp": "2021-05-16T09:21:00.505Z",
  "eventType": "google.pubsub.topic.publish",
  "params": ,
  "resource": 
    "name": "projects/<project-id>/topics/firebase-schedule-scheduledFunctionCrontab-us-central1",
    "service": "pubsub.googleapis.com",
    "type": "type.googleapis.com/google.pubsub.v1.PubsubMessage"
  

要让所有用户的截止日期都已过,您可以使用以下查询:

const snapshot = admin.firestore().collections("posts").where("data", "<=", Date.now()).get()
const userIds = snapshots.docs.map(post => post.data().idUser)
//Array of users IDs of posts with due date passed

请注意我使用了UNIX Timestamp 而不是日期作为字符串。然后,您可以根据需要为具有这些 UID 的用户执行操作。

【讨论】:

意思是需要在params中加上uid吧? @DipanSharma 用户无法调用计划的云功能,因此它在上下文中没有 UID。它由 Pub/Sub 触发器调用。结帐this。仅当上下文对象由 rtdb 触发器触发或为可调用函数时,它才会包含身份验证信息。 是的,明白你的意思,但我们必须有一些方法可以存储或获取 uid :( @DipanSharma 这取决于您要做什么。 OP 没有指定任何用例。 是的@Dharamraj【参考方案2】:

您可以从 firebase 函数中的以下 context.auth.id 获取用户 ID。

const query = await db.collection("posts")
      .where("date", "==", date)
      .where("idUser", "==", context.auth.id) //something like this
      .get();

【讨论】:

在计划云功能的情况下是不正确的。 auth 属性为空。 TypeError: 无法读取未定义的属性“id”

以上是关于从 Cloud Functions for Firebase 获取当前用户 ID(PubSub 触发器)的主要内容,如果未能解决你的问题,请参考以下文章

从 Cloud Functions for Firebase 中的 Firestore 触发器获取用户 ID?

从 Cloud Functions for Firebase 获取当前用户 ID(PubSub 触发器)

具有 Cloud Functions for Firebase 的自定义观察者

Cloud Functions for Firebase:无法访问 BigQuery

Cloud Functions for Firebase - 检索已部署的代码? [复制]

Cloud Functions for Firebase:在不触及最大超时的情况下完成长流程