Облачная функция Firebase ничего не делает с Xstate - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь написать облачную функцию в Firebase, которая обновляет документ в Firebase, когда пишется другой. Для этого я использую метод триггера onWrite. Для этого я использую Xstate, так как мой исходный код более сложный, но идея та же (и проблема тоже). Это код, который я использую (Typescript):

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
import { Machine, interpret } from "xstate";

admin.initializeApp({});

// This function will trigger as soon as a product of a company owner gets updated.
exports.productsOnUpdate = functions.firestore
  .document(`companies/{companyId}/{products}/{productId}`)
  .onWrite((change: any) => {

    let done = false;

    const PromiseFunction = (docIn: any) => {
      console.log(docIn);
      return admin
        .firestore()
        .collection("test")
        .doc("testdoc")
        .set({ products: docIn.products }, { merge: true })
        .then((doc: FirebaseFirestore.WriteResult) => doc.writeTime);
    };

    const myMachine = Machine<any>({
      id: "myMachine",
      initial: "idle",
      context: { doc: { products: "a product" } },
      states: {
        idle: {
          on: {
            INIT: "init"
          }
        },
        init: {
          invoke: {
            id: "setDoc",
            src: (context, event) => PromiseFunction(context.doc),
            onDone: {
              target: "success"
            },
            onError: {
              target: "failure"
            }
          }
        },

        success: {},
        failure: {}
      }
    }); // end of machine

    const MyMachine = interpret(myMachine).onTransition(state => {
      console.log(state.value);
      // actually do something here
      switch (state.value) {
        case "INIT":
          break;

        case "success":
          done = true;
          console.log("Success");

        case "failure":
          console.log("Something went wrong");

        default:
          break;
      }
    });

    MyMachine.start();
    MyMachine.send("INIT");
    while (done === false);
    return "ok";
  });

Таким образом, при попытке обновить документ в подгруппе «products», это должно вызвать функцию. В журнале вижу следующее:

function log

Абсолютно ничего не происходит. Когда я делаю небольшую ошибку в контексте MyMachine (изменить context: { doc: { products: "a product" } }, на context: { doc: { product: "a product" } }, я вижу это:

enter image description here

Так что, кажется, что-то не так с обработкой обещаний или около того. Я уже потратил на это целый день, любая помощь приветствуется!

1 Ответ

1 голос
/ 09 апреля 2020

Вы должны позволить xstate решить ваши обещания. Удалите оператор then из вашего PromiseFunction:

const PromiseFunction = (docIn: any) => {
  console.log(docIn);
  return admin
    .firestore()
    .collection("test")
    .doc("testdoc")
    .set({ products: docIn.products }, { merge: true })
};

Выполните обработку с вашим разрешенным Promise в onDone блоке

onDone: {
  target: "success",
  actions: (ctx, e) => console.log(e), // do stuff with your resolved Promise
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...