Я пытаюсь заставить 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 });
})()