无法读取admin.firestore.collection.doc.get.then.doc

时间:2019-01-21 18:25:46

标签: javascript firebase google-cloud-firestore google-cloud-functions

我创建了此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)

1 个答案:

答案 0 :(得分:2)

鉴于您在uid上键入它们,则只能在创建用户后创建它。我将假设您是在创建用户之后立即从客户端应用程序执行此操作的。

在部署功能之后,下次运行它们时,将发生所谓的冷启动,其中Cloud Functions会启动一个新容器来运行新代码。这可能会花费一些时间,并且显然,该时间对于客户端应用程序为新用户创建文档而言已经足够。

重复调用通常不需要启动新的容器,在这种情况下,auto的云功能会在客户端应用程序写入用户文档之前被触发。

我建议将发送通知的功能转换为HTTPS触发的Cloud Function,然后在创建文档后从客户端应用程序显式调用它。