Ошибка: Не удается найти обработчик модуля AWS Lambda

#aws-lambda #yaml #serverless

Вопрос:

Здравствуйте, я пытаюсь настроить новый бессерверный проект graphql, но serverless.yml файл не находит моего обработчика, который находится в src/graphql.ts

Это приводит к такой ошибке:

 Failure: Cannot find module '/Users/VIU/Projects/am/src/graphql'
 

Он src находится в корневом каталоге, и путь указан правильно, поэтому я не понимаю, что происходит.

serverless.yml Выглядит это примерно так:

 graphql:
  handler: src/graphql.graphqlHandler
  events:
    - http:
        path: graphql
        method: post
        cors: true
    - http:
        path: graphql
        method: get
        cors: true
 

И файл обработчика graphql выглядит следующим образом:

 import { ApolloServer, gql } from "apollo-server-lambda"

// Construct a schema, using GraphQL schema language
const typeDefs = gql`
  type Query {
    hello: String
  }
`;

// Provide resolver functions for your schema fields
const resolvers = {
  Query: {
    hello: () => 'Hello world!',
  },
};

const server = new ApolloServer({ typeDefs, resolvers });

exports.graphqlHandler = server.createHandler();
 

Я тоже пытался

 module.exports.graphqlHandler = server.createHandler();
 
 export const graphqlHandler = server.createHandler();
 

Но и это, похоже, тоже не работает.

Есть ли у кого-нибудь представление о том, что я делаю не так? Спасибо!

Ответ №1:

Для запуска функции AWS Lambda с Node.js во время выполнения вам нужно будет предоставить .js файл в качестве его обработчика. В частности, при использовании TypeScript и бессерверной платформы это означает, что handler поле должно ссылаться на имя скомпилированного файла, а именно заканчиваться .js расширением.

Один из вариантов решения этой проблемы-просто изменить handler поле, чтобы оно указывало на скомпилированную версию вашего файла. Например, учитывая следующую структуру:

 ├── am
│   ├── built
│   │   └── graphql.js
│   ├── package-lock.json
│   ├── package.json
│   └── src
│       └── graphql.ts
└── serverless.yaml
 

Правильное handler поле-это:

 graphql:
  handler: built/graphql.graphqlHandler
 

Тем не менее, другой вариант, который я считаю предпочтительным (и, возможно, то, к чему вы изначально стремились), заключается в использовании плагина без сервера-плагина-typescript для бессерверной платформы. Это должно сократить ваши усилия и позволить вам почти беспрепятственно использовать TypeScript. На самом деле есть пример, предоставленный компанией Serverless, который очень похож на ваши потребности, и я думаю, что вы можете найти его полезным.

Комментарии:

1. Супер! это то, что я искал, спасибо!