Arhn - архитектура программирования

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

При попытке добавить новый элемент (запрос) для коллекции в моем Firestore, хотя элемент правильно вставлен в коллекцию, я получаю сообщение об ошибке, которое я не могу понять.

обновлено

Необработанная ошибка RangeError: превышен максимальный размер стека вызовов на isLength (/srv/node_modules/lodash/lodash.js:11739:22) на isArrayLike (/srv/node_modules/lodash/lodash.js:11359:31) на ключах (/ srv /node_modules/lodash/lodash.js:13333:14) в /srv/node_modules/lodash/lodash.js:4920:21 в baseForOwn (/srv/node_modules/lodash/lodash.js:2990:24) в Function.mapValues (/srv/node_modules/lodash/lodash.js:13426:7) в кодировке (/srv/node_modules/firebase-functions/lib/providers/https.js:184:18) в / srv / node_modules / lodash / lodash. js: 13427: 38 в /srv/node_modules/lodash/lodash.js:4925:15 в baseForOwn (/srv/node_modules/lodash/lodash.js:2990:24)

HTML

<!-- new request modal -->
  <div class="new-request">
    <div class="modal">
      <h2>New request</h2>
      <form>
        <input type="text" name="request" placeholder="request...">
        <button>Add</button>
        <p class="error"></p>
      </form>
    </div>
  </div>

app.js

// add a new request
const requestForm = document.querySelector(".new-request form");
const requestModal = document.querySelector(".new-request");
requestForm.addEventListener("submit", (e) => {
  e.preventDefault();

  const addRequest = firebase.functions().httpsCallable("addRequest");
  addRequest({
    text: requestForm.request.value,
  })
  .then(() => {
    requestForm.reset();
    requestModal.classList.remove("open");
    requestForm.querySelector(".error").textContent = "";
  })
  .catch((error) => {
    requestForm.querySelector(".error").textContent = error.message;
  });
});

index.js (функции firebase) обновлен *

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

// auth trigger (user sign up)
exports.newUserSignup = functions.auth.user().onCreate((user) => {
  // for background triggers you must return a value/promise
  return admin.firestore().collection("users").doc(user.uid).set({
    email: user.email,
    upvotedOn: [],
  });
});

// auth trigger (user deleted)
exports.userDeleted = functions.auth.user().onDelete((user) => {
  // for background triggers you must return a value/promise
  const doc = admin.firestore().collection("users").doc(user.uid);
  return doc.delete();
});

// http callable function (adding a request)
exports.addRequest = functions.https.onCall((data, context) => {
  if (!context.auth) {
    throw new functions.https.HttpsError(
      "unauthenticated",
      "only authenticated users can add requests"
    );
  }
  if (data.text.length > 30) {
    throw new functions.https.HttpsError(
      "invalid-argument",
      "request must be no more than 30 characters long"
    );
  }
  return admin.firestore().collection("requests").add({
    text: data.text,
    upvotes: 0,
  });
});

  • Я пробовал ваш код, он отлично работает, воспроизвести не могу. Это ошибка на стороне клиента или на стороне сервера? 13.10.2020
  • Ошибка @LouisCoulet на консоли Chrome: service.ts: 160 POST us-central1-requests -demo-74dd6.cloudfunctions.net/addRequest 500 13.10.2020
  • Как уже говорилось, это должно быть что-то за пределами опубликованного вами кода. Видите ли вы что-нибудь в консоли Firebase ›Функции› Журналы? 13.10.2020
  • @LouisCoulet Да, необработанная ошибка RangeError: превышен максимальный размер стека вызовов 13.10.2020
  • Отлично, это сужает проблему до вашего файла index.js. Вы скопировали сюда все его содержимое? Кроме того, не на что еще указывать на стек вызовов в журналах? 13.10.2020
  • @LouisCoulet Теперь обновлено. 13.10.2020
  • У меня все еще работает нормально. Извините, я ничем не могу вам помочь. Я предлагаю вам попробовать сверкающие журналы: functions.logger.log("call addRequest"); или выполнить локальную отладку с помощью эмуляторов, чтобы понять, что происходит. 13.10.2020
  • @LouisCoulet Не знаю, полезно ли это, но на вкладке сети Chrome есть двойной вызов addRequest, возможно, в этом проблема? 13.10.2020
  • Нет, это нормально, наверное, один OPTIONS и один POST запрос? Это механизм CORS. 13.10.2020
  • @LouisCoulet, может быть, версия движка узла? использую 8 прямо сейчас (бесплатный план) 13.10.2020
  • Я не могу сказать. Вы получили информацию по журналам? 13.10.2020
  • @LouisCoulet У меня есть несколько обновлений: 1) Пробовал различные заголовки и разные данные, но все еще выдает внутреннюю ошибку сервера 500 при почтовых запросах к облачным функциям firebase. 2) Пробовал эмулятор firebase (локальный отладчик функций firebase), и он работает без ошибок. Мысли ? 14.10.2020
  • Привет, Моше. Я предлагаю вам зарегистрировать стек вызовов в addRequest, чтобы точно определить проблему, вместо того, чтобы пытаться угадать! 14.10.2020
  • @LouisCoulet Комментарий был слишком длинным ... поэтому я обновил сообщение выше, посмотрите и спасибо. 14.10.2020
  • Хорошо, похоже, проблема похожа на stackoverflow.com/a/52569728/6016470 Я попытаюсь объяснить в моем ответе 15.10.2020

Ответы:


1

Эта проблема аналогична этой: https://stackoverflow.com/a/52569728/6016470
Вы не должен напрямую возвращать Promise ‹DocumentReference›, созданный вашим вызовом в firestore как результат вашей облачной функции. Это связано с тем, что DocumentReference не предназначен для отправки обратно, поскольку он не сериализуемый (ваше сообщение об ошибке возникает из-за того, что lodash не удается сериализовать из-за циклических ссылок).

Итак, чтобы отправить сериализуемый результат, вы должны изменить свои функции как таковые:

exports.addRequest = functions.https.onCall((data, context) => {
  // ... 
  return admin.firestore().collection("requests").add({
    text: data.text,
    upvotes: 0,
  }).then(doc => {
    return doc.id;
  });
});

Таким образом, ваша облачная функция теперь возвращает Promise ‹string›, поэтому она может отправить свой результат вашему клиенту.

14.10.2020
  • Спасибо за объяснение! У меня есть бонусный вопрос - вы сказали, что код работает на вашей стороне до предложенного решения, как это? 19.10.2020
  • Рад слышать! Я думаю, это может быть связано с разницей в версиях пакетов node или npm. С вашим исходным кодом, с узлом v12 и текущими пакетами Firebase может сериализовать DocumentReference и отправить его обратно. Я бы по-прежнему предлагал использовать вышеприведенное решение, поскольку этот объект не выглядит предназначенным для сериализации. 23.10.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..