Функции Firebase - как обрабатывать необходимость ожидания завершения асинхронного процесса, прежде чем приложение Express будет готово к экспорту - PullRequest
1 голос
/ 26 июня 2019

Я пытаюсь заставить Apollo Gateway работать в облачных функциях Google (особенно через firebase).Запустить сервер apollo очень просто для облачных функций с помощью следующего кода

const functions = require("firebase-functions");
const { ApolloServer } = require("apollo-server-express");
var app = require("express")();

const server = new ApolloServer({
schema: buildFederatedSchema([{ typeDefs, resolvers }])
});

server.applyMiddleware({ app });

exports.apollo = functions.https.onRequest(app);

Все это прекрасно работает, потому что нет никаких асинхронных функций для ожидания.Но в случае шлюза apollo у нас есть функция асинхронного ожидания, чтобы сервер мог начать прослушивание.

Способ работы только с expressjs таков:

const { ApolloServer } = require("apollo-server-express");
var app = require("express")();

const gateway = new ApolloGateway({
     serviceList: [{ name: "clients", url:"http://localhost:5000/apollo/graphql" }]
});

(async () => {
  const { schema, executor } = await gateway.load();

  const server = new ApolloServer({ schema, executor });

  server.listen().then(({ url }) => {
    console.log(`? Server ready at ${url}`);
  });
})();

Итак, теперь вопросстановится, как выполнить это в облачной функции?У меня была идея передать экспресс-приложение в функции firebase, а затем сделать все асинхронные операции для инициализации прослушивания федерации.Но это не работает :(. Есть идеи?

const functions = require("firebase-functions");
const { ApolloServer } = require("apollo-server-express");
var app = require("express")();

const gateway = new ApolloGateway({
    serviceList: [{ name: "clients", url: "http://localhost:5000/apollo/graphql" }]
});

exports.apollo = functions.https.onRequest(app);

(async () => {
   const { schema, executor } = await gateway.load();
   const server = new ApolloServer({ schema, executor });
   server.applyMiddleware({ app });
})()

1 Ответ

0 голосов
/ 26 июня 2019

Я получил это на работу!Таким образом, хитрость заключалась в том, чтобы установить логику настройки федерации ВНУТРИ части onRequest.

Вот решение:

var app = require("express")();
var server;
var start_gateway = async () => {
     if (server !== undefined) return;
     const gateway = new ApolloGateway({
         serviceList: [{ name: "clients", url: "http://localhost:4000/graphql" 
                  }]
     });

     const { schema, executor } = await gateway.load();
     server = new ApolloServer({ schema, executor });
     server.applyMiddleware({ app });
     console.log("Made FEDERATED GRAPH");

     return;
};

exports.apollo = functions.https.onRequest(async (req, res) => {
        await start_gateway();
        return await app(req, res);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...