Firestore: затем срабатывает дважды?

# #node.js #google-cloud-firestore #google-cloud-functions #firebase-admin

Вопрос:

У меня есть фрагмент кода машинописного текста (я проверил скомпилированный JS: он выглядит нормально), который используется для обновления соответствующего документа в моей коллекции подписки firestore. Это функция на основе огня, которая вызывается веб-крючком с полосой.

 const setSubscriptionStateByStripeId = (  suscriptionId: string,  targetState: Stripe.Subscription.Status,  stripeSubscription: Stripe.Subscription): Promiselt;voidgt; =gt; {  return new Promiselt;voidgt;((resolve, reject) =gt; {   functions.logger.info("CHECKPOINT A");  // CHECK A  const db = admin.firestore();  db.collection("subscriptions")  .doc(suscriptionId)  .update(  {  state: targetState,  stripeSubscription: stripeSubscription,  }  )  .then(() =gt; {  functions.logger.info("CHECKPOINT B");  resolve();  })  .catch((err: Error) =gt; {  reject(new Error("could not set subscription"));  });  }); };  

Я ожидал бы, что для каждого CHECKPOINT A журнала появится ровно один CHECKPOINT B журнал. Однако, когда я фильтрую до одного выполнения, журнал функций Firebase иногда показывает:

 CHECKPOINT A CHECKPOINT B CHECKPOINT B  

Я предполагаю, что это ситуация «это имеет смысл, когда вы это понимаете». Может кто-нибудь помочь мне понять?

Комментарии:

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

2. Вы помечены google-cloud-functions , но ни ваш код, ни ваше описание не указывают на то, что они имеют отношение к делу. Если облачные функции имеют отношение к проблеме, пожалуйста, отредактируйте свой вопрос, чтобы показать, как это сделать. Если это не так, пожалуйста, удалите этот тег.

3. @DougStevenson Я добавил вспомогательный метод, в котором есть ошибка. Фрэнк: разве функции Firebase не являются просто оболочкой для облачных функций Google? Спасибо обоим: для меня большая честь, что вы прочитали мой вопрос!

Ответ №1:

Этого не должно произойти. Я не могу придумать случая, почему это должно произойти.

Скорее всего, вы неправильно фильтруете одно выполнение (или журналы ошибочны) — иногда, когда я заглядываю в журналы, я вижу то же, что и вы, но после более тщательного расследования я понимаю, что происходит и что я был неправ. Код является обещанием, что означает, что B он может быть зарегистрирован далеко за пределами точки, в которой A он зарегистрирован, и может быть смешан с журналами других исполнений.

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

 const timestamp = new Date().getTime() functions.logger.log(`CHECKPOINT A ${timestamp }`);  db.collection("subscriptions")  .where("someIdField", "==", "someId123")  .get()  .then((querySnapshot: any) =gt; {  functions.logger.log(`CHECKPOINT B ${timestamp}`);  }  

Также для изучения журналов не используйте средство просмотра журналов в интерфейсе firebase, я нашел это бесполезным. Перейдите в раздел Сведения о функциях -gt; Журналы -gt;gt; Просмотр в Обозревателе журналов.

Если это действительно происходит, пожалуйста, попробуйте предоставить полный код (или просто минимальный работоспособный пример) и скриншоты из проводника журналов, отфильтрованные для одного идентификатора выполнения. введите описание изображения здесь

Комментарии:

1. спасибо за предложение. Пошел дальше и проверил это, НО выглядит так же.. Это действительно странно и напоминает мне о временах C/C , когда установка битов или проблемы с памятью вызывали непредсказуемое поведение.