Не удается прочитать свойство 'firstName' из неопределенного в admin.firestore.collection.doc.get.then.doc - PullRequest
0 голосов
/ 21 января 2019

Я создал эти функции Firebase (пользовательский триггер 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 голосов
/ 21 января 2019

Если вы введете их в uid, вы сможете создать их только после создания пользователя. Я предполагаю, что вы делаете это из клиентского приложения, сразу после создания пользователя.

После того, как вы развернете функции, при следующем их запуске у вас будет так называемый холодный запуск, при котором Cloud Functions запускает новый контейнер для запуска нового кода. Это может занять некоторое время, и, очевидно, этого времени достаточно для того, чтобы приложение на стороне клиента создало документ для нового пользователя.

При повторных вызовах часто не требуется запускать новый контейнер, и в этом случае ваша облачная функция для functions.auth.user().onCreate запускается до того, как клиентское приложение написало документ пользователя.

Я рекомендую включить функцию, отправляющую уведомление, в облачную функцию, запускаемую по протоколу HTTPS, и затем явно вызывать ее из клиентского приложения после создания документа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...