我创建了此Firebase Functions(onCreate用户触发器)以返回新的用户数据并创建实时通知。
const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)
const createNotification = (notification => {
return admin.firestore().collection('notifications')
.add(notification)
.then(doc => console.log('notification added', doc))
})
exports.userJoined = functions.auth.user().onCreate(user => {
return admin.firestore().collection('users').doc(user.uid).get().then(doc => {
const newUser = doc.data()
const notification = {
content: 'Joined the app',
user: `${newUser.firstName} ${newUser.lastName}`,
time: admin.firestore.FieldValue.serverTimestamp()
}
return createNotification(notification)
})
})
我第一次使用firebase deploy
并创建一个新用户时,触发器可以完美地工作。但是第二次及随后的尝试Firebase Function logs
向我返回了以下错误:
TypeError: Cannot read property 'firstName' of undefined
at admin.firestore.collection.doc.get.then.doc (/user_code/index.js:28:29)
at process._tickDomainCallback (internal/process/next_tick.js:135:7)
答案 0 :(得分:2)
鉴于您在uid上键入它们,则只能在创建用户后创建它。我将假设您是在创建用户之后立即从客户端应用程序执行此操作的。
在部署功能之后,下次运行它们时,将发生所谓的冷启动,其中Cloud Functions会启动一个新容器来运行新代码。这可能会花费一些时间,并且显然,该时间对于客户端应用程序为新用户创建文档而言已经足够。
重复调用通常不需要启动新的容器,在这种情况下,auto
的云功能会在客户端应用程序写入用户文档之前被触发。
我建议将发送通知的功能转换为HTTPS触发的Cloud Function,然后在创建文档后从客户端应用程序显式调用它。