无法读取 admin.firestore.collection.doc.get.then 中未定义的属性"firstName".doc



我创建了这个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 触发的云函数,然后在创建文档后从客户端应用程序显式调用它。

相关内容

  • 没有找到相关文章

最新更新