我创建了这个Firebase Functions(onCreate user trigger)来返回新的用户数据并创建实时通知。
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)
假设您在 uid 上键入它们,则只能在创建用户后创建它。我假设您在创建用户后立即从客户端应用程序执行此操作。
部署函数后,下次运行它们时,将有一个所谓的冷启动,其中云函数启动一个新容器来运行新代码。这可能需要一些时间,显然该时间足以让客户端应用程序为新用户创建文档。
重复调用通常不需要启动新容器,在这种情况下,functions.auth.user().onCreate
云函数会在客户端应用写入用户文档之前触发。
我建议将发送通知的函数转换为 HTTPS 触发的云函数,然后在创建文档后从客户端应用程序显式调用它。