# #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 , когда установка битов или проблемы с памятью вызывали непредсказуемое поведение.