Firebase Unhandled error RangeError: Превышен максимальный размер стека вызовов - PullRequest
0 голосов
/ 28 сентября 2018

Я вызываю вызываемую функцию Firebase и возвращаю обещание, указанное в Firebase, но получаю эту ошибку:

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

Воткод:

exports.getProductInfo = functions.https.onCall((data, context) => {
  // Message text passed from the client.
  const product = data.product;
  // Authentication / user information is automatically added to the request.
  // const uid = context.auth.uid;

  // Get the current Server Timestamp
  var ts = String(Date.now());
  var key, snap, node;

  // Get the price of the specified product
  return database.ref('/products/' + product)
                 .orderByKey()
                 .endAt(ts)
                 .limitToLast(1)
                 .once('value', function (snapshot) {
                   snap = snapshot.val();
                   console.log('snap: ' + JSON.stringify(snap));

                   key = Object.keys(snap)[0];
                   node = snap[key];
                   console.log('node: ' + JSON.stringify(node));

                   return(node);
                 });
});

Вот вывод, который я вижу в своем журнале функций:

snap: {"1538004276": {"description": "Это базовый продукт", "цена": 40}}

узел: {" описание ":" Это Основной продукт "," цена ": 40}

Unhandled error RangeError: Maximum call stack size exceeded
    at Object (native)
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:4905:24
    at baseForOwn (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:2996:24)
    at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13401:7)
    at encode (/user_code/node_modules/firebase-functions/lib/providers/https.js:242:18)
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13402:38
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:4911:15
    at baseForOwn (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:2996:24)
    at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13401:7)
    at encode (/user_code/node_modules/firebase-functions/lib/providers/https.js:242:18)
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13402:38
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:4911:15
    at baseForOwn (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:2996:24)
    at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13401:7)
    at encode (/user_code/node_modules/firebase-functions/lib/providers/https.js:242:18)
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13402:38
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:4911:15
    at baseForOwn (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:2996:24)
    at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13401:7)
    at encode (/user_code/node_modules/firebase-functions/lib/providers/https.js:242:18)
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13402:38
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:4911:15
    at baseForOwn (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:2996:24)
    at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13401:7)

Помощь!

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Решением для меня было завернуть возврат в Обещание:

exports.getIssue = functions.https.onCall(data => {
const issueKey = data.issueKey

return new Promise((resolve, reject) => {
    admin
        .database()
        .ref('issue')
        .child(issueKey)
        .once('value', snapIssue => {
            let issue = snapIssue.val()
            if (issue) {
                return resolve(issue)
            } else {
                reject('Issue not found')
            }
        })
        .catch(reject)
})
0 голосов
/ 29 сентября 2018

Проблема похожа на описанную здесь .Вы возвращаете сложный объект, сгенерированный API-интерфейсом Firebase, называемый DocumentSnapshot.Снимок - это не исходные данные JSON для возврата клиенту, и он содержит циклические ссылки на другие объекты.Облачные функции застряли, пытаясь сериализовать все эти объекты.Вместо этого просто верните необработанный объект JavaScript данных в интересующем месте, вызвав val() для снимка:

return database
    .ref('/products/' + product)
    .orderByKey()
    .endAt(ts)
    .limitToLast(1)
    .once('value')             // once() returns a promise containing a snapshost
    .then(snapshot => {
        return snapshot.val()  // this is the raw JS object
    })

Обычно вы не используете оба возвращенных обещания и обратный вызов в том же вызове.Проще просто использовать обещание.

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