从 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 FirestoreonCreate
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