Firebase功能错误; “超出最大调用堆栈大小”

时间:2018-06-03 11:19:14

标签: node.js typescript firebase lodash google-cloud-firestore

我做了一个函数,通过事务在数据库中切换一个布尔值。看看:

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应用程序调用该函数时,我看到数据库中的值按预期切换,但是我从iOS中的Functions SDK收到错误:

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 :(得分:0)

我怀疑您对交易后value回调中then的内容有误解。如果您查看transaction()的API文档,您会看到它返回包含一些属性的promise,其中一个属性是DataSnapshot。您正在有效地尝试序列化该DataSnapshot对象,我认为lodash遇到了问题,可能是循环引用。

首先,尝试修复then回调的返回值,看看是否能解决问题。然后,弄清楚如何使用事务产生的DataSnapshot将您想要的值返回给客户端。