Ошибка функции Firebase;«Превышен максимальный размер стека вызовов» - PullRequest
0 голосов
/ 03 июня 2018

Я сделал функцию, которая переключает логическое значение в базе данных посредством транзакции.Взгляните:

export const toggleDoneState = functions.https.onCall((data, context) => {
    const userId = getUserIdFromCallableContext(context)
    let togglePath: admin.database.Reference

    if (!isUndefined(data.subtaskId)) {
        const subtaskId = data.subtaskId
        if (isValidString(subtaskId)) {
            togglePath = admin.database().ref("userSubtasks").child(userId).child(subtaskId).child("done")
        } else {
            throw new functions.https.HttpsError('invalid-argument', 'Expected valid Subtask Id')
        }
    } else {
        throw new functions.https.HttpsError('invalid-argument', 'Expected valid toggle type')
    }

    return togglePath.transaction(currentValue => {
        return !(currentValue || false)
    }).then(value => { 
        return { done: value }
    })
})

Это единственная развернутая мной функция! Раньше у меня работало около 15 функций, но я удалил их, чтобы сделать этот тест чище.

Когда я вызываю функцию из приложения для iOS, я вижу, что значение в базе данных переключается, как и ожидалось, но я получаю сообщение об ошибке из SDK функций в iOS:

Domain=com.firebase.functions Code=13 "INTERNAL" UserInfo={NSLocalizedDescription=INTERNAL}

Когда я просматриваю журналы функций в консоли, я вижу следующую ошибку:

Необработанная ошибка RangeError: Превышен максимальный размер стека вызовов

at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13395:23)

at encode (/user_code/node_modules/firebase-functions/lib/providers/https.js:204:18)

at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13400:38

at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:4925:15

at baseForOwn (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:3010:24)

at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13399:7)

at encode (/user_code/node_modules/firebase-functions/lib/providers/https.js:204:18)

at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13400:38

at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:4925:15

at baseForOwn (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:3010:24)

at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13399:7)

Значение в базе данных переключается, как и ожидалось, но я хотел бы не получить и ошибку и понять, почему.Любые подсказки?

1 Ответ

0 голосов
/ 03 июня 2018

Я подозреваю, что вы неправильно поняли, что означает value в обратном вызове then после вашей транзакции.Если вы посмотрите на документы API для транзакции () , вы увидите, что он возвращает обещание, содержащее пару свойств, одним из которых является DataSnapshot.Вы фактически пытаетесь сериализовать этот объект DataSnapshot, и я думаю, что у lodash возникла проблема с этим, возможно, с циклической ссылкой.

Прежде всего, попробуйте исправить возвращаемое значение вашего then обратного вызова ипосмотрим, прояснит ли это все.Затем выясните, как использовать DataSnapshot, полученный в результате транзакции, для возврата клиенту значения, которое вы намереваетесь.

...