Шлюз Apollo на AWS Lambda Не удается прочитать свойство «тип содержимого» неопределенного значения - PullRequest
1 голос
/ 25 мая 2020

У меня есть служба Node Apollo Gateway, работающая на AWS Lambda, она делегирует две разные службы GraphQL, все это отлично работает локально на моем Ma c.

Однако при работе на AWS Lambda, шлюз выдает мне эту ошибку при достижении конечной точки (ожидая увидеть игровую площадку)

{
"errorType": "TypeError",
"errorMessage": "Cannot read property 'content-type' of undefined",
"trace": [
"TypeError: Cannot read property 'content-type' of undefined",
"    at fileUploadHandler (/var/task/node_modules/apollo-server-lambda/dist/ApolloServer.js:143:50)",
"    at Runtime.handler (/var/task/node_modules/apollo-server-lambda/dist/ApolloServer.js:166:13)",
"    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
]
}

Я ничего не делаю с закачкой, а смотрю на ApolloServer. js, я можно увидеть, что обработчик создан.

Мой index.js выглядит так:

const isLambda = !!process.env.LAMBDA_TASK_ROOT;

const { ApolloServer, gql } = isLambda ? require('apollo-server-lambda') : require('apollo-server');

const { ApolloGateway, RemoteGraphQLDataSource } = require("@apollo/gateway");

const gateway = new ApolloGateway({
  serviceList: [
    { name: 'service1', url: !isLambda ? 'http://127.0.0.1:5090' : 'https://api.blah.com/search' },
    { name: 'service2', url: !isLambda ? 'http://127.0.0.1:5110' : 'https://api.elsewhere.com/other' },
 ],
});

const server = new ApolloServer({
  gateway,
  subscriptions: false,
  uploads: false,
  context: ({ event, context }) => ({
    headers: event.headers,
    functionName: context.functionName,
    event,
    context,
  }),
  playground: true,
  introspection: true,
});

if (!isLambda) {
    server.listen().then(({ url }) => {
      console.log(`? Server ready at ${url}`);
    });
} else {
    exports.graphql = server.createHandler({
      cors: {
        origin: '*',
        credentials: true,
      },
    });
}

Модули NPM, которые я использую с этим:

npm install  @apollo/gateway apollo-server-lambda graphql

Любые указания на то, что здесь может быть не так?

Обновление 25 мая 2020 г. Похоже, это связано с тем, выбираю ли я между HTTP или REST в AWS шлюзе, HTTP получает меня после этой ошибки, но я понятия не имею, что мне нужно сделать, чтобы она работала в REST

Спасибо

Chris

Ответы [ 2 ]

4 голосов
/ 02 июня 2020

Вы не сможете заставить его работать в REST, потому что код apollo не был написан с мыслью о получении ввода от AWS API-шлюза.

Ожидается, что он обработает весь запрос. Таким образом, либо вы используете API Gateway в качестве прокси, либо вам придется подделать все остальные свойства, которые он ожидает существовать.

1 голос
/ 28 июля 2020

Это то, что мне потребовалось, чтобы исправить проблему, не добавляя AWS специфических c изменений. Обратите внимание, что это в Typescript, я надеюсь, что все в порядке:

Я заключил свой вызов в функцию main и поместил это в


function runApollo(event: APIGatewayProxyEvent, context: Context, apollo: any) {
  return new Promise((resolve, reject) => {
    const callback = (error: any, body: any) =>
      error ? reject(error) : resolve(body);
    apollo(event, context, callback);
  });
}

export async function main(
  event: APIGatewayProxyEvent,
  context: Context,
  cb: Callback
) {
  const apollo = server.createHandler({
    cors: {
      origin: "*",
      credentials: true,
    },
  });

  // HERE IS WHERE YOU BACKFILL THE HEADERS
  event.httpMethod = event.httpMethod || "POST";
  event.headers = {
    "content-type": "application/json",
    ...(event.headers || {}),
  };
 // END BACKFILL

  try {
    const response = await runApollo(event, context, apollo);
    return response;
  } catch (err) {
    cb(err, null);
  }
}

У меня есть другие причины для оболочки, добавив мониторинг, ведение журнала и т. д. Но это решило мою проблему. Я не запускал этот код (поскольку я только что вытащил материал, который был указан c для моего подхода), но часть, которая вам действительно нужна, находится между комментариями.

...