首页 > 解决方案 > 如何将 Apollo Server 异步附加到 Lambda 处理程序?

问题描述

我正在使用 Apollo Server 在使用 koa.js 的 AWS Lambda 上提供 GraphQL 端点。

服务器非常简单:

import Koa from 'koa';
import Router from 'koa-router';
import bodyParser from  'koa-bodyparser';
import cors from '@koa/cors';
import logger from 'koa-logger';
import serverless from 'serverless-http';

import { createApolloServer } from './graphql';

const app = new Koa();
const router = new Router();

app.use(logger())
   .use(bodyParser())
   .use(cors())
   .use(router.routes())
   .use(router.allowedMethods());

const apollo = createApolloServer();
apollo.applyMiddleware({ app });

exports.handler = serverless(app);

createApolloServer函数只是做 areturn new ApolloServer({ ... })所以它同样简单。

但是,现在我需要缝合一个新的远程模式。问题是拼接过程是异步发生的。所以现在我的调用也createApolloServer()需要异步进行。

我显然不能const apollo = await createApolloServer()在根级别做。

到目前为止,我已经尝试过类似于以下内容:

const startServer = async () => {
   const apollo = await createGraphQLService();
   apollo.applyMiddleware({ app });
};


startServer();
exports.handler = serverless(app);

但现在我的/graphql端点返回 404。

如何启动此服务器?

标签: node.jsaws-lambdagraphql

解决方案


我能够做到这一点;不确定这是否是最好的方法,但它似乎有效:

const startServer = async () => {
   const apollo = await createGraphQLService();
   apollo.applyMiddleware({ app });

   return serverless(app);
};

let serverStartup = startServer();

exports.handler = async (event, context) => {
   let handler = await serverStartup;
   return await handler(event, context);
};

推荐阅读